Skip to content

认证和授权核心功能实现

这是一个最小但完整的认证和授权实现,展示了 JWT 和 OAuth 2.0 的核心概念和实现方式。

项目结构

auth-system/
├── src/
│   ├── jwt/
│   │   ├── generator.js     # JWT 生成器
│   │   ├── verifier.js       # JWT 验证器
│   │   └── middleware.js    # JWT 中间件
│   ├── oauth/
│   │   ├── server.js         # OAuth 服务器
│   │   ├── client.js        # OAuth 客户端
│   │   └── middleware.js    # OAuth 中间件
│   ├── models/
│   │   ├── user.js          # 用户模型
│   │   ├── role.js          # 角色模型
│   │   └── permission.js    # 权限模型
│   ├── middleware/
│   │   ├── auth.js          # 认证中间件
│   │   └── permission.js    # 权限中间件
│   └── services/
│       ├── auth-service.js   # 认证服务
│       └── oauth-service.js # OAuth 服务
├── test/
│   ├── jwt/
│   │   ├── generator.test.js # JWT 生成测试
│   │   └── verifier.test.js # JWT 验证测试
│   └── oauth/
│       ├── server.test.js    # OAuth 服务器测试
│       └── client.test.js    # OAuth 客户端测试
├── package.json
└── README.md

安装依赖

bash
npm install

运行测试

bash
npm test

核心功能

1. JWT 认证

实现 JWT 生成、验证和中间件。

2. OAuth 2.0

实现 OAuth 2.0 授权服务器和客户端。

3. 用户管理

实现用户注册、登录和权限管理。

4. 认证中间件

实现 JWT 和 OAuth 认证中间件。

使用示例

使用 JWT

javascript
const { AuthService } = require('./src/services');

const authService = new AuthService();

// 用户注册
const user = await authService.register({
  name: '张三',
  email: 'zhangsan@example.com',
  password: 'password123'
});

// 用户登录
const token = await authService.login({
  email: 'zhangsan@example.com',
  password: 'password123'
});

console.log('JWT Token:', token);

使用 OAuth

javascript
const { OAuthService } = require('./src/services');

const oauthService = new OAuthService();

// 获取授权 URL
const authUrl = oauthService.getAuthorizationUrl({
  clientId: 'your-client-id',
  redirectUri: 'http://localhost:3000/callback',
  scope: 'read write'
});

console.log('Authorization URL:', authUrl);

// 交换令牌
const tokens = await oauthService.exchangeCodeForToken({
  code: 'authorization-code-from-callback',
  clientId: 'your-client-id',
  clientSecret: 'your-client-secret',
  redirectUri: 'http://localhost:3000/callback'
});

console.log('Access Token:', tokens.accessToken);
console.log('Refresh Token:', tokens.refreshToken);

可扩展功能点

1. 刷新令牌

实现 JWT 刷新机制:

javascript
// TODO: 实现刷新令牌
async function refreshToken(refreshToken) {
  // 验证刷新令牌
  // 生成新的访问令牌
  // 返回新的令牌对
}

2. 多因素认证

添加 2FA 支持:

javascript
// TODO: 实现多因素认证
async function enable2FA(userId, secret) {
  // 生成 TOTP 密钥
  // 保存到用户记录
  // 返回 QR 码
}

async function verify2FA(userId, code) {
  // 验证 TOTP 码
  // 返回验证结果
}

3. 权限管理

实现基于角色的访问控制:

javascript
// TODO: 实现权限管理
class RBAC {
  async hasPermission(userId, permission) {
    // 查询用户角色
    // 查询角色权限
    // 检查是否有所需权限
  }
  
  async assignRole(userId, roleId) {
    // 分配角色给用户
  }
  
  async grantPermission(roleId, permission) {
    // 授予权限给角色
  }
}

4. 会话管理

实现会话黑名单:

javascript
// TODO: 实现会话黑名单
class SessionBlacklist {
  constructor(redis) {
    this.redis = redis;
  }
  
  async add(token, expiresIn) {
    // 将令牌加入黑名单
    await this.redis.setex(
      `blacklist:${token}`,
      expiresIn,
      '1'
    );
  }
  
  async isBlacklisted(token) {
    // 检查令牌是否在黑名单
    const exists = await this.redis.exists(`blacklist:${token}`);
    return exists === 1;
  }
}

5. 审计日志

记录用户操作日志:

javascript
// TODO: 实现审计日志
class AuditLogger {
  async log(action, userId, details) {
    // 记录用户操作
    // 保存到数据库
    // 用于安全审计
  }
}

下一步

查看 05-lesson-plan.md 了解详细的课程计划。


架构师AI杜公众号二维码

扫描二维码关注"架构师AI杜"公众号,获取更多技术内容和最新动态