@@ -13,77 +13,44 @@ import (
1313 "github.com/dexidp/dex/connector"
1414 "github.com/dexidp/dex/server/connectors"
1515 "github.com/dexidp/dex/server/internal"
16+ "github.com/dexidp/dex/server/tokens"
1617 "github.com/dexidp/dex/storage"
1718)
1819
19- type RefreshTokenPolicy struct {
20- rotateRefreshTokens bool // enable rotation
21-
22- absoluteLifetime time.Duration // interval from token creation to the end of its life
23- validIfNotUsedFor time.Duration // interval from last token update to the end of its life
24- reuseInterval time.Duration // interval within which old refresh token is allowed to be reused
25-
26- now func () time.Time
27-
28- logger * slog.Logger
29- }
30-
31- func NewRefreshTokenPolicy (logger * slog.Logger , rotation bool , validIfNotUsedFor , absoluteLifetime , reuseInterval string ) (* RefreshTokenPolicy , error ) {
32- r := RefreshTokenPolicy {now : time .Now , logger : logger }
20+ // NewRefreshTokenPolicy parses the refresh-token configuration into a rotation
21+ // strategy. It is the config-reading adapter; the strategy object itself lives
22+ // in the refresh package, independent of how its intervals are configured.
23+ func NewRefreshTokenPolicy (logger * slog.Logger , rotation bool , validIfNotUsedFor , absoluteLifetime , reuseInterval string ) (* tokens.RefreshStrategy , error ) {
24+ var validDur , absoluteDur , reuseDur time.Duration
3325 var err error
3426
3527 if validIfNotUsedFor != "" {
36- r . validIfNotUsedFor , err = time .ParseDuration (validIfNotUsedFor )
28+ validDur , err = time .ParseDuration (validIfNotUsedFor )
3729 if err != nil {
3830 return nil , fmt .Errorf ("invalid config value %q for refresh token valid if not used for: %v" , validIfNotUsedFor , err )
3931 }
4032 logger .Info ("config refresh tokens" , "valid_if_not_used_for" , validIfNotUsedFor )
4133 }
4234
4335 if absoluteLifetime != "" {
44- r . absoluteLifetime , err = time .ParseDuration (absoluteLifetime )
36+ absoluteDur , err = time .ParseDuration (absoluteLifetime )
4537 if err != nil {
4638 return nil , fmt .Errorf ("invalid config value %q for refresh tokens absolute lifetime: %v" , absoluteLifetime , err )
4739 }
4840 logger .Info ("config refresh tokens" , "absolute_lifetime" , absoluteLifetime )
4941 }
5042
5143 if reuseInterval != "" {
52- r . reuseInterval , err = time .ParseDuration (reuseInterval )
44+ reuseDur , err = time .ParseDuration (reuseInterval )
5345 if err != nil {
5446 return nil , fmt .Errorf ("invalid config value %q for refresh tokens reuse interval: %v" , reuseInterval , err )
5547 }
5648 logger .Info ("config refresh tokens" , "reuse_interval" , reuseInterval )
5749 }
5850
59- r .rotateRefreshTokens = ! rotation
60- logger .Info ("config refresh tokens rotation" , "enabled" , r .rotateRefreshTokens )
61- return & r , nil
62- }
63-
64- func (r * RefreshTokenPolicy ) RotationEnabled () bool {
65- return r .rotateRefreshTokens
66- }
67-
68- func (r * RefreshTokenPolicy ) CompletelyExpired (lastUsed time.Time ) bool {
69- if r .absoluteLifetime == 0 {
70- return false // expiration disabled
71- }
72- return r .now ().After (lastUsed .Add (r .absoluteLifetime ))
73- }
74-
75- func (r * RefreshTokenPolicy ) ExpiredBecauseUnused (lastUsed time.Time ) bool {
76- if r .validIfNotUsedFor == 0 {
77- return false // expiration disabled
78- }
79- return r .now ().After (lastUsed .Add (r .validIfNotUsedFor ))
80- }
81-
82- func (r * RefreshTokenPolicy ) AllowedToReuse (lastUsed time.Time ) bool {
83- if r .reuseInterval == 0 {
84- return false // expiration disabled
85- }
86- return ! r .now ().After (lastUsed .Add (r .reuseInterval ))
51+ rotate := ! rotation
52+ logger .Info ("config refresh tokens rotation" , "enabled" , rotate )
53+ return tokens .NewRefreshStrategy (rotate , absoluteDur , validDur , reuseDur , time .Now ), nil
8754}
8855
8956func contains (arr []string , item string ) bool {
@@ -339,27 +306,27 @@ func (s *Server) handleRefreshToken(w http.ResponseWriter, r *http.Request, clie
339306 // is only needed on the connector-refresh path.
340307 freshIdentity := func (ctx context.Context ) (connector.Identity , error ) {
341308 if userIdent != nil {
342- return identityFromClaims (userIdent .Claims ), nil
309+ return tokens . IdentityFromClaims (userIdent .Claims ), nil
343310 }
344311 connectorData , rerr := s .refreshConnectorData (ctx , refresh )
345312 if rerr != nil {
346313 return connector.Identity {}, rerr
347314 }
348- ident , rerr := s .refreshWithConnector (ctx , conn , connectorData , scopes , identityFromClaims (refresh .Claims ))
315+ ident , rerr := s .refreshWithConnector (ctx , conn , connectorData , scopes , tokens . IdentityFromClaims (refresh .Claims ))
349316 if rerr != nil {
350317 return ident , rerr
351318 }
352319 return ident , nil
353320 }
354321
355- rawNewToken , ident , err := s .issuer .refresh . rotate (r .Context (), refresh , token , s .refreshTokenPolicy , freshIdentity )
322+ rawNewToken , ident , err := s .issuer .Refresh . Rotate (r .Context (), refresh , token , s .refreshTokenPolicy , freshIdentity )
356323 if err != nil {
357324 s .logger .ErrorContext (r .Context (), "failed to rotate refresh token" , "err" , err )
358325 s .refreshTokenErrHelper (w , newInternalServerError ())
359326 return
360327 }
361328
362- auth := Authorization {
329+ auth := tokens. Authorization {
363330 Client : client ,
364331 Claims : storage.Claims {
365332 UserID : ident .UserID ,
@@ -375,21 +342,21 @@ func (s *Server) handleRefreshToken(w http.ResponseWriter, r *http.Request, clie
375342 AuthTime : authTime ,
376343 }
377344
378- accessToken , _ , err := s .issuer .signer . signAccessToken (r .Context (), auth )
345+ accessToken , _ , err := s .issuer .SignAccessToken (r .Context (), auth )
379346 if err != nil {
380347 s .logger .ErrorContext (r .Context (), "failed to create new access token" , "err" , err )
381348 s .refreshTokenErrHelper (w , newInternalServerError ())
382349 return
383350 }
384351
385- idToken , expiry , err := s .issuer .signer . signIDToken (r .Context (), auth , accessToken , "" )
352+ idToken , expiry , err := s .issuer .SignIDToken (r .Context (), auth , accessToken , "" )
386353 if err != nil {
387354 s .logger .ErrorContext (r .Context (), "failed to create ID token" , "err" , err )
388355 s .refreshTokenErrHelper (w , newInternalServerError ())
389356 return
390357 }
391358
392- tokens := TokenSet {AccessToken : accessToken , IDToken : idToken , RefreshToken : rawNewToken , Expiry : expiry }
359+ tokens := tokens. TokenSet {AccessToken : accessToken , IDToken : idToken , RefreshToken : rawNewToken , Expiry : expiry }
393360 if err := writeTokenResponse (w , tokens , s .now ()); err != nil {
394361 s .logger .ErrorContext (r .Context (), "failed to write token response" , "err" , err )
395362 s .refreshTokenErrHelper (w , newInternalServerError ())
0 commit comments