@@ -15,7 +15,9 @@ import (
1515 "github.com/authorizerdev/authorizer/server/cookie"
1616 "github.com/authorizerdev/authorizer/server/db"
1717 "github.com/authorizerdev/authorizer/server/memorystore"
18+ "github.com/authorizerdev/authorizer/server/parsers"
1819 "github.com/authorizerdev/authorizer/server/token"
20+ "github.com/authorizerdev/authorizer/server/utils"
1921)
2022
2123// AuthorizeHandler is the handler for the /authorize route
@@ -69,19 +71,22 @@ func AuthorizeHandler() gin.HandlerFunc {
6971 return
7072 }
7173
74+ code := uuid .New ().String ()
75+ if nonce == "" {
76+ nonce = uuid .New ().String ()
77+ }
78+
7279 log := log .WithFields (log.Fields {
7380 "response_mode" : responseMode ,
7481 "response_type" : responseType ,
7582 "state" : state ,
7683 "code_challenge" : codeChallenge ,
7784 "scope" : scope ,
7885 "redirect_uri" : redirectURI ,
86+ "nonce" : nonce ,
87+ "code" : code ,
7988 })
8089
81- code := uuid .New ().String ()
82- if nonce == "" {
83- nonce = uuid .New ().String ()
84- }
8590 memorystore .Provider .SetState (codeChallenge , code )
8691
8792 // used for response mode query or fragment
@@ -154,22 +159,22 @@ func AuthorizeHandler() gin.HandlerFunc {
154159 sessionKey = claims .LoginMethod + ":" + user .ID
155160 }
156161
157- newSessionTokenData , newSessionToken , err := token .CreateSessionToken (user , nonce , claims .Roles , scope , claims .LoginMethod )
158- if err != nil {
159- log .Debug ("CreateSessionToken failed: " , err )
160- handleResponse (gc , responseMode , loginURL , redirectURI , loginError , http .StatusOK )
161- return
162- }
163-
164- if err := memorystore .Provider .SetState (codeChallenge , code + "@" + newSessionToken ); err != nil {
165- log .Debug ("SetState failed: " , err )
166- handleResponse (gc , responseMode , loginURL , redirectURI , loginError , http .StatusOK )
167- return
168- }
169-
170162 // rollover the session for security
171163 go memorystore .Provider .DeleteUserSession (sessionKey , claims .Nonce )
172164 if responseType == constants .ResponseTypeCode {
165+ newSessionTokenData , newSessionToken , err := token .CreateSessionToken (user , nonce , claims .Roles , scope , claims .LoginMethod )
166+ if err != nil {
167+ log .Debug ("CreateSessionToken failed: " , err )
168+ handleResponse (gc , responseMode , loginURL , redirectURI , loginError , http .StatusOK )
169+ return
170+ }
171+
172+ if err := memorystore .Provider .SetState (codeChallenge , code + "@" + newSessionToken ); err != nil {
173+ log .Debug ("SetState failed: " , err )
174+ handleResponse (gc , responseMode , loginURL , redirectURI , loginError , http .StatusOK )
175+ return
176+ }
177+
173178 if err := memorystore .Provider .SetUserSession (sessionKey , constants .TokenTypeSessionToken + "_" + newSessionTokenData .Nonce , newSessionToken ); err != nil {
174179 log .Debug ("SetUserSession failed: " , err )
175180 handleResponse (gc , responseMode , loginURL , redirectURI , loginError , http .StatusOK )
@@ -218,39 +223,60 @@ func AuthorizeHandler() gin.HandlerFunc {
218223 }
219224
220225 if responseType == constants .ResponseTypeToken || responseType == constants .ResponseTypeIDToken {
221- // rollover the session for security
222- authToken , err := token .CreateAuthToken (gc , user , claims .Roles , scope , claims .LoginMethod )
226+ hostname := parsers .GetHost (gc )
227+ nonce := uuid .New ().String ()
228+ _ , fingerPrintHash , err := token .CreateSessionToken (user , nonce , claims .Roles , scope , claims .LoginMethod )
223229 if err != nil {
224- log .Debug ("CreateAuthToken failed: " , err )
230+ log .Debug ("CreateSessionToken failed: " , err )
231+ handleResponse (gc , responseMode , loginURL , redirectURI , loginError , http .StatusOK )
232+ return
233+ }
234+ accessToken , accessTokenExpiresAt , err := token .CreateAccessToken (user , claims .Roles , scope , hostname , nonce , claims .LoginMethod )
235+ if err != nil {
236+ log .Debug ("CreateAccessToken failed: " , err )
225237 handleResponse (gc , responseMode , loginURL , redirectURI , loginError , http .StatusOK )
226238 return
227239 }
228240
229- if err := memorystore .Provider .SetUserSession (sessionKey , constants .TokenTypeSessionToken + "_" + authToken .FingerPrint , authToken .FingerPrintHash ); err != nil {
241+ idToken , _ , err := token .CreateIDToken (user , claims .Roles , hostname , nonce , claims .LoginMethod )
242+ if err != nil {
243+ log .Debug ("CreateIDToken failed: " , err )
244+ handleResponse (gc , responseMode , loginURL , redirectURI , loginError , http .StatusOK )
245+ return
246+ }
247+ // rollover the session for security
248+ // authToken, err := token.CreateAuthToken(gc, user, claims.Roles, scope, claims.LoginMethod)
249+ // if err != nil {
250+ // log.Debug("CreateAuthToken failed: ", err)
251+ // handleResponse(gc, responseMode, loginURL, redirectURI, loginError, http.StatusOK)
252+ // return
253+ // }
254+
255+ if err := memorystore .Provider .SetUserSession (sessionKey , constants .TokenTypeSessionToken + "_" + nonce , fingerPrintHash ); err != nil {
230256 log .Debug ("SetUserSession failed: " , err )
231257 handleResponse (gc , responseMode , loginURL , redirectURI , loginError , http .StatusOK )
232258 return
233259 }
234260
235- if err := memorystore .Provider .SetUserSession (sessionKey , constants .TokenTypeAccessToken + "_" + authToken . FingerPrint , authToken . AccessToken . Token ); err != nil {
261+ if err := memorystore .Provider .SetUserSession (sessionKey , constants .TokenTypeAccessToken + "_" + nonce , accessToken ); err != nil {
236262 log .Debug ("SetUserSession failed: " , err )
237263 handleResponse (gc , responseMode , loginURL , redirectURI , loginError , http .StatusOK )
238264 return
239265 }
240266
241- cookie .SetSession (gc , authToken . FingerPrintHash )
267+ cookie .SetSession (gc , fingerPrintHash )
242268
243- expiresIn := authToken . AccessToken . ExpiresAt - time .Now ().Unix ()
269+ expiresIn := accessTokenExpiresAt - time .Now ().Unix ()
244270 if expiresIn <= 0 {
245271 expiresIn = 1
246272 }
247273
248274 // used of query mode
249- params := "access_token=" + authToken . AccessToken . Token + "&token_type=bearer&expires_in=" + strconv .FormatInt (expiresIn , 10 ) + "&state=" + state + "&id_token=" + authToken . IDToken . Token + "&code=" + code + "&nonce=" + nonce
275+ params := "access_token=" + accessToken + "&token_type=bearer&expires_in=" + strconv .FormatInt (expiresIn , 10 ) + "&state=" + state + "&id_token=" + idToken + "&code=" + code + "&nonce=" + nonce
250276
251277 res := map [string ]interface {}{
252- "access_token" : authToken . AccessToken . Token ,
253- "id_token" : authToken . IDToken . Token ,
278+ "access_token" : accessToken ,
279+ "id_token" : idToken ,
254280 "state" : state ,
255281 "scope" : scope ,
256282 "token_type" : "Bearer" ,
@@ -259,10 +285,16 @@ func AuthorizeHandler() gin.HandlerFunc {
259285 "nonce" : nonce ,
260286 }
261287
262- if authToken .RefreshToken != nil {
263- res ["refresh_token" ] = authToken .RefreshToken .Token
264- params += "&refresh_token=" + authToken .RefreshToken .Token
265- memorystore .Provider .SetUserSession (sessionKey , constants .TokenTypeRefreshToken + "_" + authToken .FingerPrint , authToken .RefreshToken .Token )
288+ if utils .StringSliceContains (scope , "offline_access" ) {
289+ refreshToken , _ , err := token .CreateRefreshToken (user , claims .Roles , scope , hostname , nonce , claims .LoginMethod )
290+ if err != nil {
291+ log .Debug ("SetUserSession failed: " , err )
292+ handleResponse (gc , responseMode , loginURL , redirectURI , loginError , http .StatusOK )
293+ return
294+ }
295+ res ["refresh_token" ] = refreshToken
296+ params += "&refresh_token=" + refreshToken
297+ memorystore .Provider .SetUserSession (sessionKey , constants .TokenTypeRefreshToken + "_" + nonce , refreshToken )
266298 }
267299
268300 if responseMode == constants .ResponseModeQuery {
0 commit comments