Appearance
认证和授权架构分析
高层架构
认证和授权架构可以分为以下几个层次:
┌─────────────────────────────────────────────────┐
│ 应用层 (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 的架构差异,有助于我们选择合适的认证授权方案。通过合理的架构设计,我们可以构建安全可靠的认证授权系统。
