@@ -24,8 +24,8 @@ func NewDefaultManager() *Manager {
2424
2525 // default config
2626 m .SetAuthorizeCodeExp (time .Minute * 10 )
27- m .SetImplicitTokenExp ( time .Hour * 1 )
28- m .SetClientTokenExp ( time .Hour * 2 )
27+ m .SetImplicitTokenCfg ( & Config { AccessTokenExp : time .Hour * 1 } )
28+ m .SetClientTokenCfg ( & Config { AccessTokenExp : time .Hour * 2 } )
2929 m .SetAuthorizeCodeTokenCfg (& Config {IsGenerateRefresh : true , AccessTokenExp : time .Hour * 2 , RefreshTokenExp : time .Hour * 24 * 3 })
3030 m .SetPasswordTokenCfg (& Config {IsGenerateRefresh : true , AccessTokenExp : time .Hour * 2 , RefreshTokenExp : time .Hour * 24 * 7 })
3131
@@ -70,19 +70,24 @@ func (m *Manager) SetAuthorizeCodeTokenCfg(cfg *Config) {
7070 m .gtcfg [oauth2 .AuthorizationCode ] = cfg
7171}
7272
73- // SetImplicitTokenExp Set the implicit grant token expiration time
74- func (m * Manager ) SetImplicitTokenExp ( exp time. Duration ) {
75- m .gtcfg [oauth2 .Implicit ] = & Config { AccessTokenExp : exp }
73+ // SetImplicitTokenCfg Set the implicit grant token config
74+ func (m * Manager ) SetImplicitTokenCfg ( cfg * Config ) {
75+ m .gtcfg [oauth2 .Implicit ] = cfg
7676}
7777
7878// SetPasswordTokenCfg Set the password grant token config
7979func (m * Manager ) SetPasswordTokenCfg (cfg * Config ) {
8080 m .gtcfg [oauth2 .PasswordCredentials ] = cfg
8181}
8282
83- // SetClientTokenExp Set the client grant token expiration time
84- func (m * Manager ) SetClientTokenExp (exp time.Duration ) {
85- m .gtcfg [oauth2 .ClientCredentials ] = & Config {AccessTokenExp : exp }
83+ // SetClientTokenCfg Set the client grant token config
84+ func (m * Manager ) SetClientTokenCfg (cfg * Config ) {
85+ m .gtcfg [oauth2 .ClientCredentials ] = cfg
86+ }
87+
88+ // SetRefreshTokenCfg Set the refreshing token config
89+ func (m * Manager ) SetRefreshTokenCfg (cfg * Config ) {
90+ m .gtcfg [oauth2 .Refreshing ] = cfg
8691}
8792
8893// MapTokenModel Mapping the token information model
@@ -179,28 +184,44 @@ func (m *Manager) GenerateAuthToken(rt oauth2.ResponseType, tgr *oauth2.TokenGen
179184 }
180185 _ , ierr := m .injector .Invoke (func (ti oauth2.TokenInfo , gen oauth2.AuthorizeGenerate , tgen oauth2.AccessGenerate , stor oauth2.TokenStore ) {
181186 ti = m .newTokenInfo (ti )
182- var (
183- tv string
184- terr error
185- )
187+
186188 td := & oauth2.GenerateBasic {
187189 Client : cli ,
188190 UserID : tgr .UserID ,
189191 CreateAt : time .Now (),
190192 }
191- if rt == oauth2 .Code {
192- ti .SetAccessExpiresIn (m .codeExp )
193- tv , terr = gen .Token (td )
194- } else {
195- ti .SetAccessExpiresIn (m .gtcfg [oauth2 .Implicit ].AccessTokenExp )
196- tv , _ , terr = tgen .Token (td , false )
197- }
198- if terr != nil {
199- err = terr
200- return
193+ switch rt {
194+ case oauth2 .Code :
195+ tv , terr := gen .Token (td )
196+ if terr != nil {
197+ err = terr
198+ return
199+ }
200+ ti .SetCode (tv )
201+ ti .SetCodeExpiresIn (m .codeExp )
202+ ti .SetCodeCreateAt (td .CreateAt )
203+ if exp := tgr .AccessTokenExp ; exp > 0 {
204+ ti .SetAccessExpiresIn (exp )
205+ }
206+ case oauth2 .Token :
207+ tv , rv , terr := tgen .Token (td , m .gtcfg [oauth2 .Implicit ].IsGenerateRefresh )
208+ if terr != nil {
209+ err = terr
210+ return
211+ }
212+ ti .SetAccess (tv )
213+ ti .SetAccessCreateAt (td .CreateAt )
214+ aexp := m .gtcfg [oauth2 .Implicit ].AccessTokenExp
215+ if exp := tgr .AccessTokenExp ; exp > 0 {
216+ aexp = exp
217+ }
218+ ti .SetAccessExpiresIn (aexp )
219+ if rv != "" && m .gtcfg [oauth2 .Implicit ].IsGenerateRefresh {
220+ ti .SetRefresh (rv )
221+ ti .SetRefreshCreateAt (td .CreateAt )
222+ ti .SetRefreshExpiresIn (m .gtcfg [oauth2 .Implicit ].RefreshTokenExp )
223+ }
201224 }
202- ti .SetAccess (tv )
203- ti .SetAccessCreateAt (td .CreateAt )
204225 ti .SetClientID (tgr .ClientID )
205226 ti .SetUserID (tgr .UserID )
206227 ti .SetRedirectURI (tgr .RedirectURI )
@@ -217,26 +238,58 @@ func (m *Manager) GenerateAuthToken(rt oauth2.ResponseType, tgr *oauth2.TokenGen
217238 return
218239}
219240
241+ // get authorization code data
242+ func (m * Manager ) getAuthorizationCode (code string ) (info oauth2.TokenInfo , err error ) {
243+ _ , ierr := m .injector .Invoke (func (stor oauth2.TokenStore ) {
244+ ti , terr := stor .GetByCode (code )
245+ if terr != nil {
246+ err = terr
247+ return
248+ } else if ti == nil {
249+ err = errors .ErrInvalidAuthorizeCode
250+ return
251+ } else if ti .GetCodeCreateAt ().Add (ti .GetCodeExpiresIn ()).Before (time .Now ()) {
252+ err = errors .ErrInvalidAuthorizeCode
253+ return
254+ }
255+ info = ti
256+ })
257+ if ierr != nil && err == nil {
258+ err = ierr
259+ }
260+ return
261+ }
262+
263+ // delete authorization code data
264+ func (m * Manager ) delAuthorizationCode (code string ) (err error ) {
265+ _ , ierr := m .injector .Invoke (func (stor oauth2.TokenStore ) {
266+ err = stor .RemoveByCode (code )
267+ })
268+ if ierr != nil && err == nil {
269+ err = ierr
270+ }
271+ return
272+ }
273+
220274// GenerateAccessToken Generate the access token
221275func (m * Manager ) GenerateAccessToken (gt oauth2.GrantType , tgr * oauth2.TokenGenerateRequest ) (accessToken oauth2.TokenInfo , err error ) {
222276 if gt == oauth2 .AuthorizationCode {
223- ti , terr := m .LoadAccessToken (tgr .Code )
277+ ti , terr := m .getAuthorizationCode (tgr .Code )
224278 if terr != nil {
225- if terr == errors .ErrInvalidAccessToken {
226- err = errors .ErrInvalidAuthorizeCode
227- return
228- }
229279 err = terr
230280 return
231281 } else if ti .GetRedirectURI () != tgr .RedirectURI || ti .GetClientID () != tgr .ClientID {
232282 err = errors .ErrInvalidAuthorizeCode
233283 return
234- } else if verr := m .RemoveAccessToken (tgr .Code ); verr != nil { // remove authorize code
284+ } else if verr := m .delAuthorizationCode (tgr .Code ); verr != nil {
235285 err = verr
236286 return
237287 }
238288 tgr .UserID = ti .GetUserID ()
239289 tgr .Scope = ti .GetScope ()
290+ if exp := ti .GetAccessExpiresIn (); exp > 0 {
291+ tgr .AccessTokenExp = exp
292+ }
240293 }
241294 cli , err := m .GetClient (tgr .ClientID )
242295 if err != nil {
@@ -262,13 +315,19 @@ func (m *Manager) GenerateAccessToken(gt oauth2.GrantType, tgr *oauth2.TokenGene
262315 ti .SetRedirectURI (tgr .RedirectURI )
263316 ti .SetScope (tgr .Scope )
264317 ti .SetAccessCreateAt (td .CreateAt )
265- ti .SetAccessExpiresIn (m .gtcfg [gt ].AccessTokenExp )
266318 ti .SetAccess (av )
267- if m .gtcfg [gt ].IsGenerateRefresh && rv != "" {
319+
320+ aexp := m .gtcfg [gt ].AccessTokenExp
321+ if exp := tgr .AccessTokenExp ; exp > 0 {
322+ aexp = exp
323+ }
324+ ti .SetAccessExpiresIn (aexp )
325+ if rv != "" && m .gtcfg [gt ].IsGenerateRefresh {
268326 ti .SetRefreshCreateAt (td .CreateAt )
269327 ti .SetRefreshExpiresIn (m .gtcfg [gt ].RefreshTokenExp )
270328 ti .SetRefresh (rv )
271329 }
330+
272331 err = stor .Create (ti )
273332 if err != nil {
274333 return
@@ -304,7 +363,11 @@ func (m *Manager) RefreshAccessToken(tgr *oauth2.TokenGenerateRequest) (accessTo
304363 UserID : ti .GetUserID (),
305364 CreateAt : time .Now (),
306365 }
307- tv , _ , terr := gen .Token (td , false )
366+ isGenRefresh := false
367+ if rcfg , ok := m .gtcfg [oauth2 .Refreshing ]; ok {
368+ isGenRefresh = rcfg .IsGenerateRefresh
369+ }
370+ tv , rv , terr := gen .Token (td , isGenRefresh )
308371 if terr != nil {
309372 err = terr
310373 return
@@ -314,6 +377,9 @@ func (m *Manager) RefreshAccessToken(tgr *oauth2.TokenGenerateRequest) (accessTo
314377 if scope := tgr .Scope ; scope != "" {
315378 ti .SetScope (scope )
316379 }
380+ if rv != "" {
381+ ti .SetRefresh (rv )
382+ }
317383 if verr := stor .Create (ti ); verr != nil {
318384 err = verr
319385 return
0 commit comments