forked from qor/auth
-
Notifications
You must be signed in to change notification settings - Fork 1
/
phone.go
141 lines (114 loc) · 3.8 KB
/
phone.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package phone
import (
"html/template"
"strings"
"github.com/fahmibaswara/auth"
"github.com/fahmibaswara/auth/claims"
"github.com/jinzhu/gorm"
"github.com/qor/session"
)
// Config phone provider config
type Config struct {
SendTokenHandler func(phonenumber string, context *auth.Context, DB *gorm.DB) error
CheckAuthToken func(phonenumber string, token string, context *auth.Context, DB *gorm.DB) (*claims.Claims, error)
TokenMessage string
AuthorizeHandler func(*auth.Context) (*claims.Claims, error)
TokenConfirmHandler func(*auth.Context) (*claims.Claims, error)
RegisterHandler func(*auth.Context) (*claims.Claims, error)
}
// Provider provide login with phone method
type Provider struct {
*Config
}
// New initialize phone provider
func New(config *Config) *Provider {
if config == nil {
config = &Config{}
}
provider := &Provider{Config: config}
if config.TokenConfirmHandler == nil {
config.TokenConfirmHandler = DefaultConfirmationHandler
}
if config.CheckAuthToken == nil {
config.CheckAuthToken = DefaultCheckToken
}
if config.SendTokenHandler == nil {
config.SendTokenHandler = DefaultSendTokenHandler
}
if config.TokenMessage == "" {
config.TokenMessage = DefaultTokenMessage
}
if config.AuthorizeHandler == nil {
config.AuthorizeHandler = DefaultAuthorizeHandler
}
if config.RegisterHandler == nil {
config.RegisterHandler = DefaultRegisterHandler
}
return provider
}
// GetName return provider name
func (Provider) GetName() string {
return "phone"
}
// ConfigAuth config auth
func (provider Provider) ConfigAuth(auth *auth.Auth) {
auth.Render.RegisterViewPath("github.com/fahmibaswara/auth/providers/phone/views")
}
// Login implemented login with phone provider
func (provider Provider) Login(context *auth.Context) {
DefaultLoginFormHandler(context, provider.AuthorizeHandler)
}
// Logout implemented logout with phone provider
func (provider Provider) Logout(context *auth.Context) {
context.Auth.LogoutHandler(context)
}
// Register implemented register with phone provider
func (provider Provider) Register(context *auth.Context) {
DefaultRegisterFormHandler(context, provider.RegisterHandler)
}
// Callback implement Callback with password provider
func (provider Provider) Callback(context *auth.Context) {
}
// ServeHTTP implement ServeHTTP with phone provider
func (provider Provider) ServeHTTP(context *auth.Context) {
var (
req = context.Request
reqPath = strings.TrimPrefix(req.URL.Path, context.Auth.URLPrefix)
paths = strings.Split(reqPath, "/")
phoneNumber template.HTML
)
flases := context.SessionStorer.Flashes(context.Writer, context.Request)
for _, msg := range flases {
if msg.Type == "phone_number" {
phoneNumber = msg.Message
}
}
if len(paths) >= 2 {
switch paths[1] {
case "new":
// render change password page
context.Auth.Config.Render.Execute("auth/providers/new/phone", context, context.Request, context.Writer)
break
case "confirmation":
if len(paths) >= 3 {
switch paths[2] {
case "resend":
// render new confirmation page
context.Auth.Config.Render.Execute("auth/login/providers/phone", context, context.Request, context.Writer)
case "check":
DefaultConfirmationFormHandler(context, provider.TokenConfirmHandler)
}
}
if phoneNumber == "" {
context.SessionStorer.Flash(context.Writer, context.Request, session.Message{Message: "Please Resubmit Phone Number"})
context.Auth.Redirector.Redirect(context.Writer, context.Request, "missing_phone_number")
return
}
context.Auth.Config.Render.RegisterFuncMap("req_phone_number", func() template.HTML { return phoneNumber })
// render new confirmation page
context.Auth.Config.Render.Execute("auth/confirmation/providers/phone", context, context.Request, context.Writer)
break
}
}
return
}