OAuth 联合认证服务器 · 详细时序图
重点:state / nonce 双层桥接,以及登录 Session 的建立时机
用户浏览器
客户端应用
client_id=A1
你们的 OAuth 服务器
Azure AD B2C
GET /authorize?client_id=A1&redirect_uri=..&state=S1&code_challenge=C1&nonce=N1
校验 client_id / redirect_uri
白名单(精确匹配)
alt [ 无登录 session ]
保存 transaction 上下文
(S1, C1, N1, client_id, redirect_uri) → txn_id
生成内部 state=S2, nonce=N2
重定向 /authorize?state=S2&nonce=N2&...
展示登录页(联合到客户企业 Azure AD)
完成账号密码 / MFA 认证
回调携带 code 及 state=S2
用 code 换取 B2C 的 id_token
校验 id_token
签名 / iss / aud / exp / nonce=N2
(防重放的关键校验点)
用 txn_id 取回原始上下文 (S1, C1, N1)
建立登录 Session
写 HttpOnly + Secure + SameSite Cookie
session 与用户身份绑定(与 client_id 无关)
else [ 已有登录 session(SSO 命中)]
直接使用 session 中的用户身份
跳过 B2C 与登录页展示
end
生成一次性 authorization code
与 client_id / code_challenge / N1 / 用户身份绑定
TTL 60~120 秒
302 重定向携带 code + 原始 state=S1(必须原样带回)
POST /token (code, code_verifier, client_id)
校验 code_verifier 与 C1 匹配(PKCE)
校验 code 未被使用过(一次性)
用 N1 签发 id_token nonce
签发自有 id_token(iss=你们自己,nonce=N1) + access_token + refresh_token
下游客户端会话相关状态(S1/C1/N1)
与 B2C 交互相关状态(S2/N2)
登录 Session 建立与复用