@@ -55,37 +55,33 @@ type Server struct {
5555 AuthorizeScopeHandler AuthorizeScopeHandler
5656}
5757
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 ) {
6059 if req == nil {
6160 uerr = err
6261 return
6362 }
6463 data , _ := s .GetErrorData (err )
65- err = s .resRedirect (w , req , data )
64+ err = s .redirect (w , req , data )
6665 return
6766}
6867
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 {
7371 return
7472 }
7573 w .Header ().Set ("Location" , uri )
7674 w .WriteHeader (302 )
7775 return
7876}
7977
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 ) {
8279 data , statusCode := s .GetErrorData (err )
83- uerr = s .resToken (w , data , statusCode )
80+ uerr = s .token (w , data , statusCode )
8481 return
8582}
8683
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 ) {
8985 w .Header ().Set ("Content-Type" , "application/json;charset=UTF-8" )
9086 w .Header ().Set ("Cache-Control" , "no-store" )
9187 w .Header ().Set ("Pragma" , "no-cache" )
@@ -157,18 +153,19 @@ func (s *Server) CheckResponseType(rt oauth2.ResponseType) bool {
157153
158154// GetAuthorizeToken get authorization token(code)
159155func (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 == "" ||
161160 req .ClientID == "" {
162161 err = errors .ErrInvalidRequest
163162 return
164- } else if req .ResponseType == "" {
165- err = errors .ErrUnsupportedResponseType
166- return
167163 }
168164 if allowed := s .CheckResponseType (req .ResponseType ); ! allowed {
169165 err = errors .ErrUnauthorizedClient
170166 return
171167 }
168+ // check the client allows the grant type
172169 if fn := s .ClientAuthorizedHandler ; fn != nil {
173170 gt := oauth2 .AuthorizationCode
174171 if req .ResponseType == oauth2 .Token {
@@ -183,6 +180,7 @@ func (s *Server) GetAuthorizeToken(req *AuthorizeRequest) (ti oauth2.TokenInfo,
183180 return
184181 }
185182 }
183+ // check the client allows the authorized scope
186184 if fn := s .ClientScopeHandler ; fn != nil {
187185 allowed , verr := fn (req .ClientID , req .Scope )
188186 if verr != nil {
@@ -194,13 +192,11 @@ func (s *Server) GetAuthorizeToken(req *AuthorizeRequest) (ti oauth2.TokenInfo,
194192 }
195193 }
196194 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 ,
204200 }
205201 ti , err = s .Manager .GenerateAuthToken (req .ResponseType , tgr )
206202 return
@@ -222,13 +218,13 @@ func (s *Server) GetAuthorizeData(rt oauth2.ResponseType, ti oauth2.TokenInfo) (
222218func (s * Server ) HandleAuthorizeRequest (w http.ResponseWriter , r * http.Request ) (err error ) {
223219 req , verr := s .ValidationAuthorizeRequest (r )
224220 if verr != nil {
225- err = s .resRedirectError (w , req , verr )
221+ err = s .redirectError (w , req , verr )
226222 return
227223 }
228224 // user authorization
229225 userID , verr := s .UserAuthorizationHandler (w , r )
230226 if verr != nil {
231- err = s .resRedirectError (w , req , verr )
227+ err = s .redirectError (w , req , verr )
232228 return
233229 } else if userID == "" {
234230 return
@@ -250,16 +246,15 @@ func (s *Server) HandleAuthorizeRequest(w http.ResponseWriter, r *http.Request)
250246 if verr != nil {
251247 err = verr
252248 return
253- } else if exp > 0 {
254- req .AccessTokenExp = exp
255249 }
250+ req .AccessTokenExp = exp
256251 }
257252 ti , verr := s .GetAuthorizeToken (req )
258253 if verr != nil {
259- err = s .resRedirectError (w , req , verr )
254+ err = s .redirectError (w , req , verr )
260255 return
261256 }
262- err = s .resRedirect (w , req , s .GetAuthorizeData (req .ResponseType , ti ))
257+ err = s .redirect (w , req , s .GetAuthorizeData (req .ResponseType , ti ))
263258 return
264259}
265260
@@ -433,15 +428,15 @@ func (s *Server) GetTokenData(ti oauth2.TokenInfo) (data map[string]interface{})
433428func (s * Server ) HandleTokenRequest (w http.ResponseWriter , r * http.Request ) (err error ) {
434429 gt , tgr , verr := s .ValidationTokenRequest (r )
435430 if verr != nil {
436- err = s .resTokenError (w , verr )
431+ err = s .tokenError (w , verr )
437432 return
438433 }
439434 ti , verr := s .GetAccessToken (gt , tgr )
440435 if verr != nil {
441- err = s .resTokenError (w , verr )
436+ err = s .tokenError (w , verr )
442437 return
443438 }
444- err = s .resToken (w , s .GetTokenData (ti ))
439+ err = s .token (w , s .GetTokenData (ti ))
445440 return
446441}
447442
@@ -453,24 +448,31 @@ func (s *Server) GetErrorData(err error) (data map[string]interface{}, statusCod
453448 }
454449 err = errors .ErrServerError
455450 }
456- var re * errors.Response
451+ re := & errors.Response {
452+ Error : err ,
453+ Description : errors .Descriptions [err ],
454+ StatusCode : errors .StatusCodes [err ],
455+ }
457456 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
463459 }
464460 }
465461 data = map [string ]interface {}{
466462 "error" : re .Error .Error (),
467463 }
464+ if v := re .ErrorCode ; v != 0 {
465+ data ["error_code" ] = v
466+ }
468467 if v := re .Description ; v != "" {
469468 data ["error_description" ] = v
470469 }
471470 if v := re .URI ; v != "" {
472471 data ["error_uri" ] = v
473472 }
474- statusCode = re .StatusCode
473+ statusCode = 400
474+ if v := re .StatusCode ; v > 0 {
475+ statusCode = v
476+ }
475477 return
476478}
0 commit comments