OAuth 2.0 授权流程
W-ID 实现 OAuth 2.0 Authorization Code Flow,支持 PKCE 和 UserInfo。请求 openid scope 时发行独立的 id_token;配置 OIDC ES256 签名密钥后,其公钥由 GET /oauth/jwks 发布,未配置时保留 HS256 模式。id_token 仅用于登录身份声明,不能当 access token 调用 API。当前 OAuth access token 仍由 W-ID 以 HS256 签发,不能使用上述 ID-token 公钥直接验签。
应用内验签与高频 API
普通 Web BFF 登录后,应用使用 SDK 的 issue_session / verify_session 签发和本地校验自己的 HttpOnly 会话,不需要每个页面请求再查 W-ID。扩展、桌面端的翻译批次和上传分片,也应使用应用拥有的短期凭证。
- 首次连接:后端在线验证所属区域的 W-ID access token,核对 active、issuer、allowlisted client_id、audience、subject、scope 和有效期。失败不能视为登录成功。
- 签发:复用 SDK
sign_session_claims / verify_session_claims(JS 为signSessionClaims / verifySessionClaims),以该产品、该区域自己的密钥签发短期应用凭证,例如最长 300 秒且不超过原 access token 到期时间;绑定应用 origin、audience、W-ID realm 和 token purpose。 - 请求:SDK 本地验签后,应用仍须严格检查上述 claims、到期时间,以及每个资源的 owner、tenant、scope 和权益。SDK 通用验签不会自动完成这些业务授权。
- 续接:到期前自动续接,同账号和区域的并发续接合并。401 后只续接一次;退出、切换账号或区域时停止旧任务,不无限重试。已有正常的 W-ID refresh rotation 规则保持不变。
本地凭证不能感知刚发生的 W-ID 撤销。采用最长 300 秒并在续接时重新确认,撤销窗口就是最多 300 秒;另加 introspection 缓存会增加可见性延迟。需要即时产品退出时,复用本地有界会话存储检查 active 状态;重启或淘汰应明确返回 401 并自动重新连接。高敏感操作继续遵循专门的实时校验契约。
应用密钥只在后端,绝不复制 W-ID 全局签名密钥,不把应用凭证当作 W-ID 凭证转发给下游。境内外 issuer、账号、密钥、缓存和数据各自独立;同邮箱不能自动关联。SDK 默认会话按 session_days 签发,不等于上述短期 API 凭证;选择有效期及严格 claims 检查由应用承担。
直接接受 W-ID bearer 的资源 API 仍使用 RFC 7662;Rust 的 WidIntrospector 已有有界 TTL 缓存(默认 60 秒)和请求超时,须在应用 state 中复用。首次验证或续接不可用时应明确报错,不能延长本地凭证有效期。完整 Python 示例、三语言方法映射和撤销/轮换取舍见源仓库 sdk/README.md 的“应用内验签与高频 API 接入”。
授权码 + PKCE
GET /oauth/authorize?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=YOUR_CALLBACK&
scope=openid%20email%20profile&
state=RANDOM_STATE&
code_challenge=BASE64URL_SHA256_VERIFIER&
code_challenge_method=S256
POST /oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
client_id=YOUR_CLIENT_ID&
code=AUTH_CODE&
redirect_uri=YOUR_CALLBACK&
code_verifier=YOUR_PKCE_VERIFIER
Token Rotation
每次 refresh 都会返回新的 refresh token,旧 token 立即失效。
POST /oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&
client_id=YOUR_CLIENT_ID&
refresh_token=REFRESH_TOKEN
Token 撤销
POST /oauth/revoke
Content-Type: application/x-www-form-urlencoded
token=REFRESH_TOKEN&
token_type_hint=refresh_token