package service import ( "time" "with_you/internal/pkg/jwt" ) // JWTService JWT服务接口 // // 拆分为按令牌类型的解析 API,避免历史单一 ParseToken 让 refresh token 误当 access token 使用。 // 旧的 GenerateAccessToken/GenerateRefreshToken 签名保留兼容;带 Session 的版本由 SessionService // 配合使用,把 sid 写入 claims 支持撤销。 type JWTService interface { GenerateAccessToken(userID, username string) (string, error) GenerateRefreshToken(userID, username string) (string, error) // 带会话 ID 的签发:sid 写入 claims,供 RequireAuth 校验会话有效性。 GenerateAccessTokenWithSession(userID, username, sessionID string) (string, error) GenerateRefreshTokenWithSession(userID, username, sessionID string) (string, error) // 按令牌类型严格解析。 ParseAccessToken(tokenString string) (*jwt.Claims, error) ParseRefreshToken(tokenString string) (*jwt.Claims, error) // Deprecated: 仅做签名+过期校验,不区分令牌类型。新代码应使用 ParseAccessToken/ParseRefreshToken。 ParseToken(tokenString string) (*jwt.Claims, error) // Deprecated: 新代码直接用 ParseAccessToken。保留仅为历史调用点平滑迁移。 ValidateToken(tokenString string) error } // jwtServiceImpl JWT服务实现 type jwtServiceImpl struct { jwt *jwt.JWT } // NewJWTService 创建JWT服务 func NewJWTService(secret string, accessExpire, refreshExpire int64) JWTService { return &jwtServiceImpl{ jwt: jwt.New(secret, time.Duration(accessExpire)*time.Second, time.Duration(refreshExpire)*time.Second), } } // GenerateAccessToken 生成访问令牌(不带 sid,仅向后兼容)。 func (s *jwtServiceImpl) GenerateAccessToken(userID, username string) (string, error) { return s.jwt.GenerateAccessToken(userID, username, "") } // GenerateRefreshToken 生成刷新令牌(不带 sid,仅向后兼容)。 func (s *jwtServiceImpl) GenerateRefreshToken(userID, username string) (string, error) { return s.jwt.GenerateRefreshToken(userID, username, "") } // GenerateAccessTokenWithSession 生成带会话 ID 的访问令牌。 func (s *jwtServiceImpl) GenerateAccessTokenWithSession(userID, username, sessionID string) (string, error) { return s.jwt.GenerateAccessToken(userID, username, sessionID) } // GenerateRefreshTokenWithSession 生成带会话 ID 的刷新令牌。 func (s *jwtServiceImpl) GenerateRefreshTokenWithSession(userID, username, sessionID string) (string, error) { return s.jwt.GenerateRefreshToken(userID, username, sessionID) } // ParseAccessToken 解析访问令牌(仅接受 typ=access)。 func (s *jwtServiceImpl) ParseAccessToken(tokenString string) (*jwt.Claims, error) { return s.jwt.ParseAccessToken(tokenString) } // ParseRefreshToken 解析刷新令牌(仅接受 typ=refresh)。 func (s *jwtServiceImpl) ParseRefreshToken(tokenString string) (*jwt.Claims, error) { return s.jwt.ParseRefreshToken(tokenString) } // ParseToken 解析令牌(兼容签名)。 // // Deprecated: 新代码使用 ParseAccessToken / ParseRefreshToken。 // 这里内部仍走 ParseAccessToken 以拒绝 refresh token,避免历史调用点继续把 refresh 当 access 使用。 func (s *jwtServiceImpl) ParseToken(tokenString string) (*jwt.Claims, error) { return s.jwt.ParseToken(tokenString) } // ValidateToken 验证令牌。 // // Deprecated: 新代码直接使用 ParseAccessToken。 func (s *jwtServiceImpl) ValidateToken(tokenString string) error { return s.jwt.ValidateToken(tokenString) }