Skip to content

认证和授权架构分析

高层架构

认证和授权架构可以分为以下几个层次:

┌─────────────────────────────────────────────────┐
│           应用层 (Application)               │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  路由    │  │  控制器   │  │  中间件   ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│           认证层 (Authentication)            │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  JWT     │  │  OAuth    │  │  Session  ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│           用户层 (User)                      │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  User    │  │  Role    │  │  Permission││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│           存储层 (Storage)                   │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  Redis   │  │  MongoDB │  │  PostgreSQL││
│  └──────────┘  └──────────┘  └──────────┘│
└─────────────────────────────────────────────────┘

JWT 架构

JWT 认证流程

┌─────────┐       ┌─────────────┐       ┌──────────────┐       ┌──────────┐
│  用户   │──────▶│   客户端   │──────▶│  API 服务器  │──────▶│  数据库   │
└─────────┘       └─────────────┘       └──────────────┘       └──────────┘
     │                   │                       │                   │
     │  1. 登录请求      │  2. 验证凭证          │  3. 查询用户
     │◀──────────────────│◀──────────────────────│◀─────────────────│
     │                   │                       │                   │
     │  4. 返回 JWT      │  5. 生成 JWT          │
     │──────────────────▶│──────────────────────▶│                   │
     │                   │                       │                   │
     │  6. 存储 JWT      │                       │                   │
     │                   │                       │                   │
     │  7. 携带 JWT 请求│                       │                   │
     │──────────────────▶│──────────────────────▶│                   │
     │                   │                       │  8. 验证 JWT
     │                   │                       │◀─────────────────│
     │                   │                       │                   │
     │  9. 返回数据      │                       │
     │◀──────────────────│◀──────────────────────│                   │

JWT 组件架构

┌─────────────────────────────────────────────────┐
│              JWT 认证系统                   │
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  生成器  │  │  验证器   │  │  解码器   ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  中间件  │  │  工具函数 │  │  配置     ││
│  └──────────┘  └──────────┘  └──────────┘│
└─────────────────────────────────────────────────┘

OAuth 2.0 架构

OAuth 2.0 授权流程

┌─────────┐       ┌─────────────┐       ┌──────────────┐       ┌──────────┐
│  用户   │──────▶│   客户端   │──────▶│  授权服务器  │──────▶│  资源   │
└─────────┘       └─────────────┘       └──────────────┘       └──────────┘
     │                   │                       │                   │
     │  1. 授权请求      │  2. 用户授权          │
     │◀──────────────────│◀──────────────────────│                   │
     │                   │                       │  3. 授权码
     │  4. 授权码        │◀──────────────────────│                   │
     │──────────────────▶│                       │                   │
     │                   │                       │  5. 访问令牌
     │  6. 交换令牌      │◀──────────────────────│                   │
     │◀──────────────────│                       │                   │
     │                   │                       │  7. 访问资源
     │  8. 访问令牌      │──────────────────────▶│                   │
     │──────────────────▶│                       │                   │
     │                   │  9. 返回资源          │
     │◀──────────────────│◀──────────────────────│                   │

OAuth 2.0 组件架构

┌─────────────────────────────────────────────────┐
│            OAuth 2.0 授权系统                │
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  客户端  │  │  授权端点 │  │  令牌端点 ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  状态管理 │  │  PKCE     │  │  令牌存储 ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  中间件  │  │  工具函数 │  │  配置     ││
│  └──────────┘  └──────────┘  └──────────┘│
└─────────────────────────────────────────────────┘

认证中间件架构

中间件链

┌─────────────────────────────────────────────────┐
│              请求处理流程                   │
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  日志     │  │  CORS     │  │  限流     ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  认证     │  │  授权     │  │  验证     ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  错误处理 │  │  响应格式 │  │  控制器   ││
│  └──────────┘  └──────────┘  └──────────┘│
└─────────────────────────────────────────────────┘

JWT 中间件

┌─────────────────────────────────────────────────┐
│           JWT 认证中间件                   │
├─────────────────────────────────────────────────┤
│  1. 提取令牌                            │
│     - 从 Authorization 头提取              │
│     - 从 Cookie 提取                      │
│     - 从查询参数提取                      │
├─────────────────────────────────────────────────┤
│  2. 验证令牌                            │
│     - 验证签名                            │
│     - 验证过期时间                        │
│     - 验证签发者                          │
├─────────────────────────────────────────────────┤
│  3. 解码载荷                            │
│     - 提取用户信息                        │
│     - 验证权限                            │
├─────────────────────────────────────────────────┤
│  4. 附加到请求                          │
│     - req.user = 解码后的用户信息           │
│     - req.token = 原始令牌                │
├─────────────────────────────────────────────────┤
│  5. 继续处理                            │
│     - next() 调用                          │
└─────────────────────────────────────────────────┘

权限控制架构

RBAC 模型

┌─────────────────────────────────────────────────┐
│         基于角色的访问控制(RBAC)           │
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  用户     │  │  角色     │  │  权限     ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │ 用户-角色 │  │ 角色-权限 │  │  资源     ││
│  └──────────┘  └──────────┘  └──────────┘│
└─────────────────────────────────────────────────┘

关系:
用户 ──N──M── 角色 ──N──M── 权限

权限检查流程

┌─────────────────────────────────────────────────┐
│            权限检查流程                   │
├─────────────────────────────────────────────────┤
│  1. 提取用户信息                        │
│     - 从 JWT 提取用户 ID                 │
│     - 从数据库查询用户角色                  │
├─────────────────────────────────────────────────┤
│  2. 提取所需权限                        │
│     - 从路由定义提取所需权限               │
│     - 从资源定义提取所需权限               │
├─────────────────────────────────────────────────┤
│  3. 检查用户权限                        │
│     - 查询用户的所有权限                  │
│     - 检查是否包含所需权限               │
├─────────────────────────────────────────────────┤
│  4. 授权决策                            │
│     - 有权限:允许访问                    │
│     - 无权限:返回 403 Forbidden          │
└─────────────────────────────────────────────────┘

会话管理架构

会话存储

┌─────────────────────────────────────────────────┐
│            会话存储策略                   │
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  内存     │  │  Redis    │  │  数据库   ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  特点:                                    │
│  - 内存:快速但重启丢失                   │
│  - Redis:快速且持久化                   │
│  - 数据库:持久化但较慢                 │
└─────────────────────────────────────────────────┘

会话黑名单

┌─────────────────────────────────────────────────┐
│            JWT 黑名单机制                   │
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  Redis   │  │  过期时间 │  │  自动清理 ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  流程:                                    │
│  1. 用户登出时将 JWT 加入黑名单          │
│  2. 设置过期时间为 JWT 的过期时间         │
│  3. 验证 JWT 时检查黑名单               │
│  4. Redis 自动清理过期的黑名单项         │
└─────────────────────────────────────────────────┘

安全架构

多层安全

┌─────────────────────────────────────────────────┐
│            多层安全防护                   │
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  网络层  │  │  应用层   │  │  数据层   ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  网络层:                                │
│  - HTTPS/TLS 加密                        │
│  - 防火墙规则                            │
│  - DDoS 防护                             │
├─────────────────────────────────────────────────┤
│  应用层:                                │
│  - 输入验证                              │
│  - 输出编码                              │
│  - CSRF 防护                              │
├─────────────────────────────────────────────────┤
│  数据层:                                │
│  - 密码哈希                             │
│  - 数据加密                              │
│  - 访问控制                              │
└─────────────────────────────────────────────────┘

密码安全

┌─────────────────────────────────────────────────┐
│            密码安全策略                   │
├─────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐│
│  │  哈希     │  │  盐值     │  │  迭代     ││
│  └──────────┘  └──────────┘  └──────────┘│
├─────────────────────────────────────────────────┤
│  算法:                                    │
│  - bcrypt:推荐,自动盐值                 │
│  - scrypt:内存密集,抗 GPU 攻击        │
│  - Argon2:抗 ASIC 攻击                 │
├─────────────────────────────────────────────────┤
│  最佳实践:                                │
│  - 使用强哈希算法                        │
│  - 设置足够的迭代次数                    │
│  - 每个用户使用唯一的盐值              │
│  - 定期更新哈希算法                    │
└─────────────────────────────────────────────────┘

总结

认证和授权架构涉及多个层次,从网络层到数据层。理解 JWT 和 OAuth 2.0 的架构差异,有助于我们选择合适的认证授权方案。通过合理的架构设计,我们可以构建安全可靠的认证授权系统。