滑动续期、网络错误归类、API Key 激活乐观锁与生效提示

This commit is contained in:
2026-08-11 11:45:03 +08:00
parent 23b2820101
commit e63af49831
21 changed files with 679 additions and 15 deletions
+39
View File
@@ -431,3 +431,42 @@ func (s *AuthService) cleanupSessionsOnce(ctx context.Context) {
log.Printf("session cleanup: %v", err)
}
}
// MaybeRenew 滑动续期:对剩余有效期不足 renewThreshold 的令牌换发同会话
// (同 jti / 同版本)新令牌,并把会话行有效期延长到新过期点,不新建会话行。
// 仅供鉴权通过后的请求调用(令牌有效性已由 ParseTokenProof 保证);
// 无需换发或换发失败返回 ok=false,调用方跳过即可。
func (s *AuthService) MaybeRenew(ctx context.Context, tokenString string) (string, time.Time, bool) {
claims := &authClaims{}
if _, err := jwt.ParseWithClaims(tokenString, claims, func(*jwt.Token) (any, error) {
return s.jwtSecret, nil
}); err != nil || claims.ExpiresAt == nil {
return "", time.Time{}, false
}
if time.Until(claims.ExpiresAt.Time) >= renewThreshold {
return "", time.Time{}, false
}
token, expires, _, err := s.signTokenWithJTI(claims.Subject, claims.Ver, claims.ID)
if err != nil {
return "", time.Time{}, false
}
if err := s.extendSessionExpiry(ctx, claims.ID, expires); err != nil {
log.Printf("[WARN] %v", err)
return "", time.Time{}, false
}
return token, expires, true
}
// extendSessionExpiry 把会话行有效期延长到新过期点,保证「活跃会话」展示与
// 清理任务看到真实过期时间;无行(存量令牌)静默跳过。
func (s *AuthService) extendSessionExpiry(ctx context.Context, jti string, expires time.Time) error {
if jti == "" {
return nil
}
err := s.db.WithContext(ctx).Model(&model.UserSession{}).
Where("token_id = ?", jti).UpdateColumn("expires_at", expires).Error
if err != nil {
return fmt.Errorf("extend session expiry: %w", err)
}
return nil
}