登录认证
Nest 后端(youlai-nest)提供两种会话模式,通过环境变量切换:
SESSION_TYPE=jwtSESSION_TYPE=redis-token
请求头统一使用:
http
Authorization: Bearer <accessToken>JWT 模式
- 登录:
POST /api/v1/auth/login - 验证码:
GET /api/v1/auth/captcha
返回结构示例:
json
{
"code": "00000",
"msg": "成功",
"data": {
"tokenType": "Bearer",
"accessToken": "...",
"refreshToken": "...",
"expiresIn": 7200
}
}JWT 载荷中通常包含:
- 基本信息:
sub、username、deptId、dataScope、roles - Token版本号:
tokenVersion(Redis:auth:user:token_version:{userId}) - 令牌 ID:
jti(用于黑名单)
校验逻辑一般包括:
- 验签 + 过期时间
- 校验版本号:
token.tokenVersion < redis.currentVersion时 Token 失效 - 校验黑名单:命中
auth:token:blacklist:{jti}时 Token 失效
典型场景:
- 正常退出:当前 JWT 的
jti写入黑名单 - 修改/重置密码:自增
auth:user:token_version:{userId},该用户所有旧 Token 失效
JWT 校验通常包括:验签/过期时间、版本号(tokenVersion)与黑名单(jti)。
Redis-Token 模式
- 登录接口同样为:
POST /api/v1/auth/login - accessToken/refreshToken 为随机串,在线信息存放 Redis
Redis 键设计(与 Java 后端保持一致):
auth:token:access:{accessToken}→ OnlineUserauth:token:refresh:{refreshToken}→ OnlineUserauth:user:access:{userId}→ 当前 accessTokenauth:user:refresh:{userId}→ 当前 refreshToken
全局守卫会:
- 读取
Bearer <accessToken> - 查询
auth:token:access:{accessToken} - 未命中则视为未登录
刷新与退出
- 刷新:
POST /api/v1/auth/refresh-token?refreshToken=... - 退出:
DELETE /api/v1/auth/logout
模式选择建议
SESSION_TYPE=jwt:偏无状态,扩展性好,满足大多数场景SESSION_TYPE=redis-token:偏会话中心,便于统一查看/管理在线用户
