@@ -45,9 +45,7 @@ import (
4545 "github.com/authorizerdev/authorizer/server/cookie"
4646 "github.com/authorizerdev/authorizer/server/db"
4747 "github.com/authorizerdev/authorizer/server/memorystore"
48- "github.com/authorizerdev/authorizer/server/parsers"
4948 "github.com/authorizerdev/authorizer/server/token"
50- "github.com/authorizerdev/authorizer/server/utils"
5149)
5250
5351// Check the flow for generating and verifying codes: https://developer.okta.com/blog/2019/08/22/okta-authjs-pkce#:~:text=PKCE%20works%20by%20having%20the,is%20called%20the%20Code%20Challenge.
@@ -108,19 +106,11 @@ func AuthorizeHandler() gin.HandlerFunc {
108106 }
109107
110108 log := log .WithFields (log.Fields {
111- "response_mode" : responseMode ,
112- "response_type" : responseType ,
113- "state" : state ,
114- "code_challenge" : codeChallenge ,
115- "scope" : scope ,
116- "redirect_uri" : redirectURI ,
117- "nonce" : nonce ,
118- "code" : code ,
109+ "response_mode" : responseMode ,
110+ "response_type" : responseType ,
119111 })
120112
121- // memorystore.Provider.SetState(codeChallenge, code)
122113 // TODO add state with timeout
123-
124114 // used for response mode query or fragment
125115 loginState := "state=" + state + "&scope=" + strings .Join (scope , " " ) + "&redirect_uri=" + redirectURI
126116 if responseType == constants .ResponseTypeCode {
@@ -141,17 +131,6 @@ func AuthorizeHandler() gin.HandlerFunc {
141131 loginURL = "/app#" + loginState
142132 }
143133
144- if state == "" {
145- handleResponse (gc , responseMode , loginURL , redirectURI , map [string ]interface {}{
146- "type" : "authorization_response" ,
147- "response" : map [string ]interface {}{
148- "error" : "state_required" ,
149- "error_description" : "state is required" ,
150- },
151- }, http .StatusOK )
152- return
153- }
154-
155134 if responseType == constants .ResponseTypeCode && codeChallenge == "" {
156135 handleResponse (gc , responseMode , loginURL , redirectURI , map [string ]interface {}{
157136 "type" : "authorization_response" ,
@@ -275,7 +254,6 @@ func AuthorizeHandler() gin.HandlerFunc {
275254 }
276255
277256 if responseType == constants .ResponseTypeToken || responseType == constants .ResponseTypeIDToken {
278- hostname := parsers .GetHost (gc )
279257 // rollover the session for security
280258 authToken , err := token .CreateAuthToken (gc , user , claims .Roles , scope , claims .LoginMethod , nonce , "" )
281259 if err != nil {
@@ -299,7 +277,7 @@ func AuthorizeHandler() gin.HandlerFunc {
299277 cookie .SetSession (gc , authToken .FingerPrintHash )
300278
301279 // used of query mode
302- params := "access_token=" + authToken .AccessToken .Token + "&token_type=bearer&expires_in=" + strconv .FormatInt (authToken .IDToken .ExpiresAt , 10 ) + "&state=" + state + "&id_token=" + authToken .IDToken .Token + "&code=" + code
280+ params := "access_token=" + authToken .AccessToken .Token + "&token_type=bearer&expires_in=" + strconv .FormatInt (authToken .IDToken .ExpiresAt , 10 ) + "&state=" + state + "&id_token=" + authToken .IDToken .Token
303281
304282 res := map [string ]interface {}{
305283 "access_token" : authToken .AccessToken .Token ,
@@ -308,19 +286,17 @@ func AuthorizeHandler() gin.HandlerFunc {
308286 "scope" : scope ,
309287 "token_type" : "Bearer" ,
310288 "expires_in" : authToken .AccessToken .ExpiresAt ,
311- "code" : code ,
312289 }
313290
314- if utils .StringSliceContains (scope , "offline_access" ) {
315- refreshToken , _ , err := token .CreateRefreshToken (user , claims .Roles , scope , hostname , nonce , claims .LoginMethod )
316- if err != nil {
317- log .Debug ("SetUserSession failed: " , err )
318- handleResponse (gc , responseMode , loginURL , redirectURI , loginError , http .StatusOK )
319- return
320- }
321- res ["refresh_token" ] = refreshToken
322- params += "&refresh_token=" + refreshToken
323- memorystore .Provider .SetUserSession (sessionKey , constants .TokenTypeRefreshToken + "_" + nonce , refreshToken )
291+ if nonce != "" {
292+ params += "&nonce=" + nonce
293+ res ["nonce" ] = nonce
294+ }
295+
296+ if authToken .RefreshToken != nil {
297+ res ["refresh_token" ] = authToken .RefreshToken .Token
298+ params += "&refresh_token=" + authToken .RefreshToken .Token
299+ memorystore .Provider .SetUserSession (sessionKey , constants .TokenTypeRefreshToken + "_" + authToken .FingerPrint , authToken .RefreshToken .Token )
324300 }
325301
326302 if responseMode == constants .ResponseModeQuery {
@@ -349,6 +325,9 @@ func AuthorizeHandler() gin.HandlerFunc {
349325}
350326
351327func validateAuthorizeRequest (responseType , responseMode , clientID , state , codeChallenge string ) error {
328+ if strings .TrimSpace (state ) == "" {
329+ return fmt .Errorf ("invalid state. state is required to prevent csrf attack" , responseMode )
330+ }
352331 if responseType != constants .ResponseTypeCode && responseType != constants .ResponseTypeToken && responseType != constants .ResponseTypeIDToken {
353332 return fmt .Errorf ("invalid response type %s. 'code' & 'token' are valid response_type" , responseMode )
354333 }
@@ -387,8 +366,6 @@ func handleResponse(gc *gin.Context, responseMode, loginURI, redirectURI string,
387366 })
388367 return
389368 case constants .ResponseModeFormPost :
390- fmt .Println ("=> trying tof orm post" )
391- fmt .Printf ("=> %+v \n " , data ["response" ])
392369 gc .HTML (httpStatusCode , authorizeFormPostTemplate , gin.H {
393370 "target_origin" : redirectURI ,
394371 "authorization_response" : data ["response" ],
0 commit comments