用途
该技能用于构建安全、可扩展的认证与授权系统,采用行业标准模式和现代最佳实践。适用场景包括:实现用户认证系统、保护 REST 或 GraphQL API、添加 OAuth2/社交登录、实现基于角色的访问控制(RBAC)、设计会话管理、迁移认证系统、调试认证问题、实现 SSO 或多租户。
核心概念
认证与授权的区别
认证(AuthN):确认你是谁。包括验证身份(用户名/密码、OAuth、生物识别)、颁发凭证(会话、令牌)、管理登录/登出。
授权(AuthZ):确认你能做什么。包括权限检查、基于角色的访问控制(RBAC)、资源所有权验证、策略执行。
认证策略
基于会话:服务器存储会话状态,会话 ID 存于 Cookie,传统、简单、有状态。
基于令牌(JWT):无状态、自包含,可水平扩展,可存储声明。
OAuth2/OpenID Connect:委托认证,社交登录(Google、GitHub),企业 SSO。
主要能力
JWT 认证
JWT 结构为 header.payload.signature。提供生成 JWT(访问令牌短期有效,如 15 分钟;刷新令牌长期有效,如 7 天)、验证 JWT、认证中间件等实现。刷新令牌流程包括:将刷新令牌哈希后存入数据库、刷新访问令牌、撤销刷新令牌(登出)、撤销用户所有令牌(登出所有设备),并提供刷新和登出 API 端点。
基于会话的认证
使用 express-session 与 Redis 存储会话。配置包括:secure(生产环境仅 HTTPS)、httpOnly(禁止 JavaScript 访问)、maxAge(如 24 小时)、sameSite: 'strict'(CSRF 防护)。提供登录、会话中间件、受保护路由、登出等实现。
OAuth2 / 社交登录
使用 Passport.js 实现 Google 和 GitHub OAuth。包括查找或创建用户、认证路由、回调路由(生成 JWT 并重定向到前端)。
授权模式
基于角色的访问控制(RBAC):定义角色枚举(USER、MODERATOR、ADMIN)和角色层级,提供 hasRole 函数和 requireRole 中间件。
基于权限的访问控制:定义权限枚举(如 read:users、write:users、delete:users、read:posts、write:posts)和角色权限映射,提供 hasPermission 函数和 requirePermission 中间件。
资源所有权:检查用户是否拥有资源,管理员可访问任何资源,提供 requireOwnership 中间件。
安全最佳实践
密码安全:使用 zod 定义密码验证模式(至少 12 字符,包含大写、小写、数字、特殊字符),使用 bcrypt 哈希密码(saltRounds 为 12),提供注册接口。
速率限制:使用 express-rate-limit 和 Redis 存储,登录限制器(15 分钟 5 次尝试),API 限制器(每分钟 100 次请求)。
使用方式
该技能以代码模式形式提供,包含 TypeScript/JavaScript 示例,使用 Express、jsonwebtoken、bcrypt、express-session、connect-redis、redis、passport、passport-google-oauth20、passport-github2、zod、express-rate-limit、rate-limit-redis 等库。开发者可根据示例代码集成到自己的项目中。
最佳实践
- 绝不存储明文密码:始终使用 bcrypt/argon2 哈希
- 使用 HTTPS:加密传输中的数据
- 短期访问令牌:最长 15-30 分钟
- 安全 Cookie:httpOnly、secure、sameSite 标志
- 验证所有输入:邮箱格式、密码强度
- 对认证端点进行速率限制:防止暴力破解
限制
资料未提供该技能的具体安装命令、平台支持范围、收费信息或效果保证。