@@ -55,37 +55,33 @@ type Server struct {
55
55
AuthorizeScopeHandler AuthorizeScopeHandler
56
56
}
57
57
58
- // response redirect error
59
- func (s * Server ) resRedirectError (w http.ResponseWriter , req * AuthorizeRequest , err error ) (uerr error ) {
58
+ func (s * Server ) redirectError (w http.ResponseWriter , req * AuthorizeRequest , err error ) (uerr error ) {
60
59
if req == nil {
61
60
uerr = err
62
61
return
63
62
}
64
63
data , _ := s .GetErrorData (err )
65
- err = s .resRedirect (w , req , data )
64
+ err = s .redirect (w , req , data )
66
65
return
67
66
}
68
67
69
- func (s * Server ) resRedirect (w http.ResponseWriter , req * AuthorizeRequest , data map [string ]interface {}) (err error ) {
70
- uri , verr := s .GetRedirectURI (req , data )
71
- if verr != nil {
72
- err = verr
68
+ func (s * Server ) redirect (w http.ResponseWriter , req * AuthorizeRequest , data map [string ]interface {}) (err error ) {
69
+ uri , err := s .GetRedirectURI (req , data )
70
+ if err != nil {
73
71
return
74
72
}
75
73
w .Header ().Set ("Location" , uri )
76
74
w .WriteHeader (302 )
77
75
return
78
76
}
79
77
80
- // response token error
81
- func (s * Server ) resTokenError (w http.ResponseWriter , err error ) (uerr error ) {
78
+ func (s * Server ) tokenError (w http.ResponseWriter , err error ) (uerr error ) {
82
79
data , statusCode := s .GetErrorData (err )
83
- uerr = s .resToken (w , data , statusCode )
80
+ uerr = s .token (w , data , statusCode )
84
81
return
85
82
}
86
83
87
- // response token
88
- func (s * Server ) resToken (w http.ResponseWriter , data map [string ]interface {}, statusCode ... int ) (err error ) {
84
+ func (s * Server ) token (w http.ResponseWriter , data map [string ]interface {}, statusCode ... int ) (err error ) {
89
85
w .Header ().Set ("Content-Type" , "application/json;charset=UTF-8" )
90
86
w .Header ().Set ("Cache-Control" , "no-store" )
91
87
w .Header ().Set ("Pragma" , "no-cache" )
@@ -157,18 +153,19 @@ func (s *Server) CheckResponseType(rt oauth2.ResponseType) bool {
157
153
158
154
// GetAuthorizeToken get authorization token(code)
159
155
func (s * Server ) GetAuthorizeToken (req * AuthorizeRequest ) (ti oauth2.TokenInfo , err error ) {
160
- if req .RedirectURI == "" ||
156
+ if req .ResponseType == "" {
157
+ err = errors .ErrUnsupportedResponseType
158
+ return
159
+ } else if req .RedirectURI == "" ||
161
160
req .ClientID == "" {
162
161
err = errors .ErrInvalidRequest
163
162
return
164
- } else if req .ResponseType == "" {
165
- err = errors .ErrUnsupportedResponseType
166
- return
167
163
}
168
164
if allowed := s .CheckResponseType (req .ResponseType ); ! allowed {
169
165
err = errors .ErrUnauthorizedClient
170
166
return
171
167
}
168
+ // check the client allows the grant type
172
169
if fn := s .ClientAuthorizedHandler ; fn != nil {
173
170
gt := oauth2 .AuthorizationCode
174
171
if req .ResponseType == oauth2 .Token {
@@ -183,6 +180,7 @@ func (s *Server) GetAuthorizeToken(req *AuthorizeRequest) (ti oauth2.TokenInfo,
183
180
return
184
181
}
185
182
}
183
+ // check the client allows the authorized scope
186
184
if fn := s .ClientScopeHandler ; fn != nil {
187
185
allowed , verr := fn (req .ClientID , req .Scope )
188
186
if verr != nil {
@@ -194,13 +192,11 @@ func (s *Server) GetAuthorizeToken(req *AuthorizeRequest) (ti oauth2.TokenInfo,
194
192
}
195
193
}
196
194
tgr := & oauth2.TokenGenerateRequest {
197
- ClientID : req .ClientID ,
198
- UserID : req .UserID ,
199
- RedirectURI : req .RedirectURI ,
200
- Scope : req .Scope ,
201
- }
202
- if exp := req .AccessTokenExp ; exp > 0 {
203
- tgr .AccessTokenExp = exp
195
+ ClientID : req .ClientID ,
196
+ UserID : req .UserID ,
197
+ RedirectURI : req .RedirectURI ,
198
+ Scope : req .Scope ,
199
+ AccessTokenExp : req .AccessTokenExp ,
204
200
}
205
201
ti , err = s .Manager .GenerateAuthToken (req .ResponseType , tgr )
206
202
return
@@ -222,13 +218,13 @@ func (s *Server) GetAuthorizeData(rt oauth2.ResponseType, ti oauth2.TokenInfo) (
222
218
func (s * Server ) HandleAuthorizeRequest (w http.ResponseWriter , r * http.Request ) (err error ) {
223
219
req , verr := s .ValidationAuthorizeRequest (r )
224
220
if verr != nil {
225
- err = s .resRedirectError (w , req , verr )
221
+ err = s .redirectError (w , req , verr )
226
222
return
227
223
}
228
224
// user authorization
229
225
userID , verr := s .UserAuthorizationHandler (w , r )
230
226
if verr != nil {
231
- err = s .resRedirectError (w , req , verr )
227
+ err = s .redirectError (w , req , verr )
232
228
return
233
229
} else if userID == "" {
234
230
return
@@ -250,16 +246,15 @@ func (s *Server) HandleAuthorizeRequest(w http.ResponseWriter, r *http.Request)
250
246
if verr != nil {
251
247
err = verr
252
248
return
253
- } else if exp > 0 {
254
- req .AccessTokenExp = exp
255
249
}
250
+ req .AccessTokenExp = exp
256
251
}
257
252
ti , verr := s .GetAuthorizeToken (req )
258
253
if verr != nil {
259
- err = s .resRedirectError (w , req , verr )
254
+ err = s .redirectError (w , req , verr )
260
255
return
261
256
}
262
- err = s .resRedirect (w , req , s .GetAuthorizeData (req .ResponseType , ti ))
257
+ err = s .redirect (w , req , s .GetAuthorizeData (req .ResponseType , ti ))
263
258
return
264
259
}
265
260
@@ -433,15 +428,15 @@ func (s *Server) GetTokenData(ti oauth2.TokenInfo) (data map[string]interface{})
433
428
func (s * Server ) HandleTokenRequest (w http.ResponseWriter , r * http.Request ) (err error ) {
434
429
gt , tgr , verr := s .ValidationTokenRequest (r )
435
430
if verr != nil {
436
- err = s .resTokenError (w , verr )
431
+ err = s .tokenError (w , verr )
437
432
return
438
433
}
439
434
ti , verr := s .GetAccessToken (gt , tgr )
440
435
if verr != nil {
441
- err = s .resTokenError (w , verr )
436
+ err = s .tokenError (w , verr )
442
437
return
443
438
}
444
- err = s .resToken (w , s .GetTokenData (ti ))
439
+ err = s .token (w , s .GetTokenData (ti ))
445
440
return
446
441
}
447
442
@@ -453,24 +448,31 @@ func (s *Server) GetErrorData(err error) (data map[string]interface{}, statusCod
453
448
}
454
449
err = errors .ErrServerError
455
450
}
456
- var re * errors.Response
451
+ re := & errors.Response {
452
+ Error : err ,
453
+ Description : errors .Descriptions [err ],
454
+ StatusCode : errors .StatusCodes [err ],
455
+ }
457
456
if fn := s .ResponseErrorHandler ; fn != nil {
458
- re = fn (err )
459
- } else {
460
- re = & errors.Response {
461
- Error : err ,
462
- Description : errors .Descriptions [err ],
457
+ if vre := fn (err ); vre != nil {
458
+ re = vre
463
459
}
464
460
}
465
461
data = map [string ]interface {}{
466
462
"error" : re .Error .Error (),
467
463
}
464
+ if v := re .ErrorCode ; v != 0 {
465
+ data ["error_code" ] = v
466
+ }
468
467
if v := re .Description ; v != "" {
469
468
data ["error_description" ] = v
470
469
}
471
470
if v := re .URI ; v != "" {
472
471
data ["error_uri" ] = v
473
472
}
474
- statusCode = re .StatusCode
473
+ statusCode = 400
474
+ if v := re .StatusCode ; v > 0 {
475
+ statusCode = v
476
+ }
475
477
return
476
478
}
0 commit comments