OAuth 2.0 与 OpenID Connect 完全解析:现代 Web 认证架构

前端安全(更新于 2026年5月25日)

认证 vs 授权

概念 问题 协议
认证 (Authentication) 你是谁? OpenID Connect (OIDC)
授权 (Authorization) 你能做什么? OAuth 2.0

OAuth 2.0 只做授权——允许第三方应用访问用户资源,但不告诉应用「用户是谁」。OIDC 在 OAuth 2.0 之上增加了身份层,通过 ID Token 提供用户身份信息。


OAuth 2.0 四种授权模式

1. 授权码模式(最安全,Web 应用首选)

用户 → 点击「GitHub 登录」
     → 跳转到 GitHub 授权页
     → 用户同意授权
     → GitHub 返回 authorization_code
     → 后端用 code 换取 access_token
     → 后端用 token 调用 GitHub API

2. PKCE 扩展(SPA/移动端必备)

纯前端应用无法安全存储 client_secret,PKCE 通过动态 code_verifier 防止授权码拦截:

前端生成 code_verifier + code_challenge
     → 授权请求携带 code_challenge
     → 换取 token 时提交 code_verifier
     → 服务端验证 challenge === SHA256(verifier)

3. 客户端凭证模式(服务间调用)

Service A → 用 client_id + client_secret 直接获取 token
         → 调用 Service B 的 API

4. 隐式模式(已废弃)

token 直接通过 URL fragment 返回 → 改用授权码 + PKCE。


Token 类型对比

Token 格式 用途 有效期
Authorization Code 随机字符串 一次性,换取 token 10 分钟
Access Token JWT 或 opaque 访问受保护资源 15-60 分钟
Refresh Token 随机字符串 获取新 Access Token 7-30 天
ID Token JWT 用户身份信息 (OIDC) 与 Access Token 相同

使用 JWT 解码工具 可以查看 Access Token 和 ID Token 的 payload 内容。


OIDC 的身份层

ID Token 是 JWT,包含用户身份信息:

{
  "iss": "https://accounts.google.com",
  "sub": "1234567890",
  "aud": "your-client-id",
  "exp": 1717200000,
  "email": "user@example.com",
  "name": "张三",
  "picture": "https://..."
}
Claim 含义
iss 身份提供者 (IdP)
sub 用户唯一标识
aud 客户端 ID
email 用户邮箱
name 显示名称

安全最佳实践

1. 永远在后端验证 Token

// ❌ 前端解码 JWT 就认为用户已认证
const payload = decodeJwt(token);
if (payload.exp > Date.now()) { /* 信任 */ }

// ✅ 后端验证签名 + 所有 claims
const verified = await verifyJwt(token, publicKey, {
  issuer: 'https://accounts.google.com',
  audience: 'your-client-id',
});

2. State 参数防 CSRF

const state = crypto.randomUUID();
sessionStorage.setItem('oauth_state', state);
// 授权 URL 中添加 &state=${state}
// 回调时验证 state 匹配

3. Token 存储

环境 推荐方案
Web 后端 HttpOnly Cookie + Secure + SameSite
SPA 内存存储 + Refresh Token 轮转
移动端 安全存储 (Keychain/Keystore)

调试 OAuth 流程

  1. 检查 Authorization URL 参数是否完整(client_id, redirect_uri, scope, state)
  2. JWT 解码 检查 Access Token 的 scope 和 exp
  3. 验证 redirect_uri 与注册值完全匹配
  4. 检查 CORS 配置是否允许 token endpoint

总结

OAuth 2.0 + OIDC 是现代 Web 认证的基石。理解授权码流程、PKCE 扩展、Token 类型差异,以及「前端解码 ≠ 后端验证」的安全原则,是每个全栈开发者的必备知识。

本站提供浏览器本地工具,免注册即可试用 →

#OAuth2#OIDC#认证#JWT#安全