4.1 KiB
4.1 KiB
OAuth 2.0 授权流程演示
概述
本演示展示了完整的OAuth 2.0授权码流程,包括用户同意授权的步骤。
系统架构
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 第三方应用 │ │ OAuth提供商 │ │ 用户 │
│ (Client App)│ │ (Your App) │ │ (User) │
└─────────────┘ └─────────────┘ └─────────────┘
完整流程演示
步骤 1: 启动服务
# 启动后端API服务
npm start
# 启动前端服务
npm run dev:frontend
步骤 2: 用户注册和登录
- 访问
http://localhost:3001
- 注册新用户或登录现有用户
- 进入个人中心
步骤 3: 创建OAuth客户端
- 在个人中心点击"创建OAuth客户端"
- 填写应用信息:
- 应用名称:测试应用
- 应用描述:这是一个测试OAuth流程的应用
- 重定向URI:
http://localhost:3001/third-party-app.html
- 创建客户端并记录客户端ID和密钥
步骤 4: 使用第三方应用示例
- 打开第三方应用示例:
http://localhost:3001/third-party-app.html
- 填入刚才创建的客户端ID和密钥
- 点击"开始OAuth授权"按钮
步骤 5: 授权流程
- 系统重定向到授权页面:
http://localhost:3001/oauth/authorize
- 用户看到应用信息和请求的权限
- 用户选择"同意授权"或"拒绝授权"
步骤 6: 获取访问令牌
- 如果用户同意授权,系统会重定向回第三方应用
- 第三方应用使用授权码交换访问令牌
- 使用访问令牌获取用户信息
API 端点说明
1. 获取授权信息
GET /api/oauth/authorize
- 验证OAuth请求参数
- 返回应用信息和请求的权限
- 不直接生成授权码
2. 用户同意/拒绝授权
POST /api/oauth/authorize/consent
- 处理用户的授权决定
- 如果同意,生成授权码
- 如果拒绝,返回错误信息
3. 交换访问令牌
POST /api/oauth/token
- 使用授权码交换访问令牌
- 返回访问令牌和刷新令牌
4. 获取用户信息
GET /api/oauth/userinfo
- 使用访问令牌获取用户信息
安全特性
1. 用户同意机制
- ✅ 用户必须明确同意才能获得授权码
- ✅ 显示详细的应用信息和权限范围
- ✅ 用户可以拒绝授权
2. 令牌安全
- ✅ 访问令牌有过期时间
- ✅ 支持刷新令牌机制
- ✅ 令牌可以撤销
3. 客户端验证
- ✅ 验证客户端ID和密钥
- ✅ 验证重定向URI
- ✅ 防止重放攻击
测试方法
1. 自动化测试
npm run test:oauth-flow
2. 手动测试
- 使用前端界面测试
- 使用第三方应用示例测试
- 使用curl命令测试
3. 错误测试
- 测试无效的客户端ID
- 测试无效的重定向URI
- 测试过期的授权码
- 测试用户拒绝授权
常见问题
Q: 为什么需要用户同意?
A: 这是OAuth 2.0的核心安全特性,确保用户对第三方应用的授权是明确和可控的。
Q: 授权码可以重复使用吗?
A: 不可以,授权码只能使用一次,使用后立即失效。
Q: 访问令牌过期怎么办?
A: 使用刷新令牌获取新的访问令牌,无需用户重新授权。
Q: 如何撤销授权?
A: 可以通过撤销刷新令牌来撤销授权,用户需要重新授权。
扩展功能
1. 权限范围管理
- 支持细粒度的权限控制
- 用户可以部分授权某些权限
2. 应用管理
- 用户可以查看和管理已授权的应用
- 支持撤销特定应用的授权
3. 审计日志
- 记录所有授权和撤销操作
- 提供安全审计功能
总结
这个OAuth 2.0实现提供了完整的授权码流程,包括:
- ✅ 用户同意机制
- ✅ 安全的令牌管理
- ✅ 完整的API端点
- ✅ 友好的用户界面
- ✅ 详细的测试和文档
这确保了OAuth授权的安全性和用户体验的平衡。