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 流程
- 检查 Authorization URL 参数是否完整(client_id, redirect_uri, scope, state)
- 用 JWT 解码 检查 Access Token 的 scope 和 exp
- 验证 redirect_uri 与注册值完全匹配
- 检查 CORS 配置是否允许 token endpoint
总结
OAuth 2.0 + OIDC 是现代 Web 认证的基石。理解授权码流程、PKCE 扩展、Token 类型差异,以及「前端解码 ≠ 后端验证」的安全原则,是每个全栈开发者的必备知识。
本站提供浏览器本地工具,免注册即可试用 →
#OAuth2#OIDC#认证#JWT#安全