3.6 KiB
3.6 KiB
国内与海外 JWT/JWKS 冻结契约
双轨边界
国内现有链路
- 登录、刷新、退出和代登录接口保持原契约,不修改
TokenResponse。 - 签名算法保持
HS256,继续使用JWT_SECRET。 - Access Token 默认有效期保持 24 分钟,Refresh Token 默认有效期保持 7 天。
- 业务服务继续使用国内 HMAC 验签与 Redis 会话校验,账号停用、退出和 Token 版本失效规则不变。
- 国内 Token 保持现有 snake_case 声明,不增加海外
aud,也不要求配置 RSA/JWK。
海外尾程链路
- 海外能力默认关闭:
OVERSEAS_JWT_ENABLED=false。 - 已通过国内 HS256 与 Redis 校验的登录用户调用
POST /api/auth/overseas/token,兑换独立的海外短时 Token。 - 海外 Token 使用
RS256,默认有效期 15 分钟,不签发 Refresh Token。 - 尾程必须配置
baiyue.security.jwt-mode=jwks和baiyue.security.session-mode=claims,只做 JWKS 验签和本地安全投影校验,不创建或访问国内 Redis 会话校验器。 - 海外功能未启用时,兑换接口返回“海外认证未启用”;JWKS Controller、海外签发服务和
overseasJwtEncoder均不创建,Auth 仍可正常启动并签发国内 HS256 Token。
海外签发契约
issuer:auth-serviceaudience:lastleg-api- 算法白名单:仅
RS256 - Access Token 默认有效期:15 分钟
- 兑换接口:
POST /api/auth/overseas/token - JWKS 路径:
/api/auth/.well-known/jwks.json - Auth 直连地址:
http://{auth-host}:9100/api/auth/.well-known/jwks.json - JWKS HTTP 缓存:5 分钟,响应
Cache-Control: public, max-age=300
海外 Token 的 JSON 声明名称和类型固定如下:
| 声明 | JSON 类型 | 说明 |
|---|---|---|
sub |
string | 用户 ID 的字符串形式 |
jti |
string | Token 唯一标识 |
iat |
number | 签发时间 |
exp |
number | 过期时间 |
aud |
string array | 固定包含 lastleg-api |
userId |
number | 认证用户 ID |
tenantId |
number | 当前客户 ID;平台账号为平台作用域值 |
appCode |
string | PLATFORM 或 MERCHANT |
roles |
string array | 当前角色编码快照 |
authorities |
string array | 当前权限编码快照 |
permissionVersion |
number | IAM 单调权限版本 |
海外 Token 从 V1 起只使用上述 camelCase 自定义声明,不读取国内 snake_case 声明。
海外配置
baiyue:
security:
overseas-jwt:
enabled: ${OVERSEAS_JWT_ENABLED:false}
issuer: ${OVERSEAS_JWT_ISSUER:auth-service}
audience: ${OVERSEAS_JWT_AUDIENCE:lastleg-api}
rsa-jwk-set: ${OVERSEAS_JWT_RSA_JWK_SET:}
current-kid: ${OVERSEAS_JWT_CURRENT_KID:}
access-token-ttl: ${OVERSEAS_ACCESS_TOKEN_TTL:15m}
只有显式启用海外能力时才校验 OVERSEAS_JWT_RSA_JWK_SET 和 OVERSEAS_JWT_CURRENT_KID。启用后配置不合法必须启动失败,避免错误密钥签发。
密钥轮换
- JWK Set 只允许 RSA 密钥。
OVERSEAS_JWT_CURRENT_KID必须指向唯一的当前签名私钥,JWT Header 写入该kid。- 非当前密钥只能保留公钥;JWKS 只发布公钥,不得输出私钥参数。
- 轮换时同时发布当前公钥和上一公钥,上一公钥至少保留 20 分钟,即 15 分钟最大 Token 生命周期加 5 分钟 JWKS 缓存。
- 重叠期结束后移除上一公钥,禁止复用历史
kid。
IAM 安全事件
安全事件的 eventType、版本、状态枚举和 payload 以 iam/SECURITY-EVENT-AUDIT.md 为唯一契约。尾程维护用户状态、客户状态和权限版本的本地投影,请求期间不反向同步访问国内 IAM。