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 建立与复用