OAuth 2.0 是一种广泛使用的授权协议,允许应用程序在用户授权的情况下访问受保护的资源(如 API)。它主要用于现代 Web 和移动应用中实现安全的第三方授权访问。以下是 OAuth 2.0 的核心概念和流程总结:
OAuth 2.0 核心角色
1、Resource Owner(资源拥有者)
- 拥有资源权限的实体,通常是用户。
2、Client(客户端)
- 请求访问资源的应用程序(例如:一个第三方 App 或网站)。
3、Authorization Server(授权服务器)
- 验证用户身份并颁发访问令牌(Access Token)的服务。
4、Resource Server(资源服务器)
- 存储受保护资源的服务器,通过 Access Token 来验证请求。
OAuth 2.0 授权流程(以 Authorization Code Flow 为例)
这是最常见、最安全的一种流程,适用于 Web 应用或具备后端服务的应用。
步骤:
1、用户访问客户端应用 → 被重定向到授权服务器
GET /authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=SCOPE
2、用户登录并授权客户端访问其资源
3、授权服务器将用户重定向回客户端,并附上 authorization code
https://client.example.com/callback?code=AUTHORIZATION_CODE
4、客户端使用 authorization code 向授权服务器请求 access token
POST /token
Body: grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI&client_id=CLIENT_ID&client_secret=CLIENT_SECRET
5、授权服务器返回 access token(可能还有 refresh token)
6、客户端使用 access token 访问资源服务器上的受保护资源
常见的 Grant Types(授权类型)
类型 | 用途 | 是否需要 client secret |
Authorization Code | Web Apps, Mobile Apps | 是 |
Implicit | 前端单页应用(SPA) | 否 |
Client Credentials | 服务间通信(无用户上下文) | 是 |
Password (不推荐) | 用户直接提供账号密码给客户端 | 是 |
Refresh Token | 刷新过期的 access token | 是 |
Password 模式因安全性问题,官方已不推荐使用。
Token 类型
- Access Token:用于访问资源服务器的短期凭证(通常为 JWT 格式)
- Refresh Token:用于获取新的 access token 的长期凭证
安全注意事项
- 使用 HTTPS 确保传输安全;
- access token 应该设置较短的有效时间;
- refresh token 应加密存储并限制使用次数;
- 授权码(authorization code)应是一次性且有时效限制;
- 避免在 URL 中暴露敏感信息(如 tokens);
示例场景
场景:正在开发一个“社交分析平台”,想访问用户的 Twitter 数据
- 用户点击 “Connect with Twitter”
- 平台将用户跳转到 Twitter 授权页面
- 用户同意授权
- Twitter 返回一个 authorization_code
- 你的后端用这个 code 换取 access_token
- 使用 access_token 请求 Twitter API 获取用户数据
工具与框架(开发相关)
- Java: Spring Security OAuth2
- Node.js: Passport.js
- Python: Authlib, Django OAuth Toolkit
- 前端 SPA: OIDC + PKCE(增强隐式流的安全性)