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