Skip to content

Commit ec003f5

Browse files
committed
Read User Identity once
Signed-off-by: maksim.nabokikh <max.nabokih@gmail.com>
1 parent 90bb8eb commit ec003f5

1 file changed

Lines changed: 19 additions & 24 deletions

File tree

server/refreshhandlers.go

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ func (s *Server) updateOfflineSession(ctx context.Context, refresh *storage.Refr
312312
}
313313

314314
// updateRefreshToken updates refresh token and offline session in the storage
315-
func (s *Server) updateRefreshToken(ctx context.Context, rCtx *refreshContext) (*internal.RefreshToken, connector.Identity, *refreshError) {
315+
func (s *Server) updateRefreshToken(ctx context.Context, rCtx *refreshContext, userIdent *storage.UserIdentity) (*internal.RefreshToken, connector.Identity, *refreshError) {
316316
var rerr *refreshError
317317

318318
newToken := &internal.RefreshToken{
@@ -337,17 +337,6 @@ func (s *Server) updateRefreshToken(ctx context.Context, rCtx *refreshContext) (
337337
// stored in UserIdentity at the time of the last interactive login. This aligns with the
338338
// behavior of other identity brokers (e.g., Keycloak, Auth0) that treat downstream sessions
339339
// independently from the upstream provider session lifetime.
340-
var userIdent *storage.UserIdentity
341-
if s.sessionConfig != nil {
342-
ui, err := s.storage.GetUserIdentity(ctx, rCtx.storageToken.Claims.UserID, rCtx.storageToken.ConnectorID)
343-
if err != nil {
344-
s.logger.ErrorContext(ctx, "failed to get user identity for refresh",
345-
"user_id", rCtx.storageToken.Claims.UserID, "connector_id", rCtx.storageToken.ConnectorID, "err", err)
346-
return nil, ident, newInternalServerError()
347-
}
348-
userIdent = &ui
349-
}
350-
351340
refreshTokenUpdater := func(old storage.RefreshToken) (storage.RefreshToken, error) {
352341
rotationEnabled := s.refreshTokenPolicy.RotationEnabled()
353342
reusingAllowed := s.refreshTokenPolicy.AllowedToReuse(old.LastUsed)
@@ -457,7 +446,24 @@ func (s *Server) handleRefreshToken(w http.ResponseWriter, r *http.Request, clie
457446
return
458447
}
459448

460-
newToken, ident, rerr := s.updateRefreshToken(r.Context(), rCtx)
449+
var userIdent *storage.UserIdentity
450+
451+
if s.sessionConfig != nil {
452+
ui, err := s.storage.GetUserIdentity(r.Context(), rCtx.storageToken.Claims.UserID, rCtx.storageToken.ConnectorID)
453+
if err != nil {
454+
s.logger.ErrorContext(r.Context(), "failed to get user identity", "err", err)
455+
s.refreshTokenErrHelper(w, newInternalServerError())
456+
return
457+
}
458+
userIdent = &ui
459+
}
460+
461+
authTime := time.Time{}
462+
if userIdent != nil {
463+
authTime = userIdent.LastLogin
464+
}
465+
466+
newToken, ident, rerr := s.updateRefreshToken(r.Context(), rCtx, userIdent)
461467
if rerr != nil {
462468
s.refreshTokenErrHelper(w, rerr)
463469
return
@@ -472,17 +478,6 @@ func (s *Server) handleRefreshToken(w http.ResponseWriter, r *http.Request, clie
472478
Groups: ident.Groups,
473479
}
474480

475-
authTime := time.Time{}
476-
if s.sessionConfig != nil {
477-
ui, err := s.storage.GetUserIdentity(r.Context(), ident.UserID, rCtx.storageToken.ConnectorID)
478-
if err != nil {
479-
s.logger.ErrorContext(r.Context(), "failed to get user identity", "err", err)
480-
s.refreshTokenErrHelper(w, newInternalServerError())
481-
return
482-
}
483-
authTime = ui.LastLogin
484-
}
485-
486481
accessToken, _, err := s.newAccessToken(r.Context(), client.ID, claims, rCtx.scopes, rCtx.storageToken.Nonce, rCtx.storageToken.ConnectorID, authTime)
487482
if err != nil {
488483
s.logger.ErrorContext(r.Context(), "failed to create new access token", "err", err)

0 commit comments

Comments
 (0)