Appearance
认证和授权课程计划
课程概述
本课程分为 8 节课,每节课 20-40 分钟,总时长约 120-150 分钟。通过理论讲解和实践操作,深入理解 JWT 和 OAuth 2.0 的认证授权方法。
第 1 课:课程介绍与环境准备(5 分钟)
学习目标
- 了解课程内容和目标
- 搭建开发环境
- 项目初始化
课程内容
课程介绍
- 认证和授权的区别
- JWT 和 OAuth 2.0 的特点
- 课程结构安排
环境准备
- 安装依赖
- 配置开发环境
- 初始化项目
实践操作
bash
# 安装依赖
npm install jsonwebtoken bcrypt express
# 初始化项目
npm init -y预期输出
✅ 依赖安装成功
✅ 项目初始化完成第 2 课:JWT 基础(15 分钟)
学习目标
- 理解 JWT 的结构和原理
- 掌握 JWT 的生成和验证
- 学习 JWT 的最佳实践
课程内容
JWT 结构
- Header、Payload、Signature
- 编码和签名
- 算法选择
JWT 生成
- 使用 jsonwebtoken 库
- 设置过期时间
- 自定义声明
JWT 验证
- 验证签名
- 验证过期时间
- 错误处理
实践操作
javascript
const jwt = require('jsonwebtoken');
// 生成 JWT
const token = jwt.sign(
{ userId: 123, email: 'user@example.com' },
'your-secret-key',
{ expiresIn: '1h' }
);
console.log('JWT:', token);
// 验证 JWT
try {
const decoded = jwt.verify(token, 'your-secret-key');
console.log('Decoded:', decoded);
} catch (err) {
console.error('Invalid token:', err.message);
}测试验证
bash
node examples/jwt-basic.js预期输出
JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Decoded: { userId: 123, email: 'user@example.com', iat: ..., exp: ... }第 3 课:JWT 中间件实现(15 分钟)
学习目标
- 理解中间件的工作原理
- 实现 JWT 认证中间件
- 学习错误处理
课程内容
中间件原理
- Express 中间件
- 请求处理流程
- next() 调用
JWT 中间件
- 提取令牌
- 验证令牌
- 附加用户信息
错误处理
- 认证失败
- 令牌过期
- 统一错误响应
实践操作
javascript
const jwt = require('jsonwebtoken');
function authMiddleware(req, res, next) {
// 提取令牌
const token = req.headers.authorization?.split(' ')[1];
if (!token) {
return res.status(401).json({ error: 'No token provided' });
}
try {
// 验证令牌
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (err) {
return res.status(401).json({ error: 'Invalid token' });
}
}
module.exports = authMiddleware;测试验证
bash
node test/middleware.test.js预期输出
✅ JWT middleware tests passed第 4 课:OAuth 2.0 基础(15 分钟)
学习目标
- 理解 OAuth 2.0 的授权流程
- 掌握授权码模式
- 学习 OAuth 2.0 的角色
课程内容
OAuth 2.0 概念
- 四种角色
- 四种授权模式
- 授权流程
授权码模式
- 授权请求
- 用户授权
- 令牌交换
客户端配置
- 注册应用
- 获取 Client ID
- 配置回调 URL
实践操作
javascript
const { OAuth2Client } = require('google-auth-library');
const oauth2Client = new OAuth2Client(
process.env.GOOGLE_CLIENT_ID,
process.env.GOOGLE_CLIENT_SECRET,
'http://localhost:3000/callback'
);
// 生成授权 URL
const authUrl = oauth2Client.generateAuthUrl({
access_type: 'offline',
scope: 'https://www.googleapis.com/auth/userinfo.email'
});
console.log('Authorization URL:', authUrl);
// 交换令牌
const { tokens } = await oauth2Client.getToken(code);
console.log('Access Token:', tokens.access_token);测试验证
bash
node examples/oauth-basic.js预期输出
Authorization URL: https://accounts.google.com/o/oauth2/v2/auth?...
Access Token: ya29.a0AfH6...第 5 课:用户认证系统(20 分钟)
学习目标
- 实现用户注册和登录
- 掌握密码哈希和验证
- 学习会话管理
课程内容
用户注册
- 数据验证
- 密码哈希
- 保存用户
用户登录
- 验证凭证
- 生成 JWT
- 返回令牌
密码安全
- bcrypt 哈希
- 盐值管理
- 密码强度验证
实践操作
javascript
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
// 注册
async function register(name, email, password) {
// 哈希密码
const hashedPassword = await bcrypt.hash(password, 10);
// 保存用户
const user = await User.create({
name,
email,
password: hashedPassword
});
return user;
}
// 登录
async function login(email, password) {
// 查找用户
const user = await User.findOne({ email });
if (!user) {
throw new Error('User not found');
}
// 验证密码
const isValid = await bcrypt.compare(password, user.password);
if (!isValid) {
throw new Error('Invalid password');
}
// 生成 JWT
const token = jwt.sign(
{ userId: user.id, email: user.email },
process.env.JWT_SECRET,
{ expiresIn: '1h' }
);
return { token, user };
}测试验证
bash
npm test预期输出
✅ User registration tests passed
✅ User login tests passed第 6 课:权限控制(15 分钟)
学习目标
- 理解 RBAC 模型
- 实现权限检查中间件
- 学习角色管理
课程内容
RBAC 模型
- 用户、角色、权限
- 多对多关系
- 权限继承
权限检查
- 提取用户权限
- 验证所需权限
- 权限拒绝
角色管理
- 分配角色
- 撤销角色
- 角色权限
实践操作
javascript
// 权限中间件
function requirePermission(permission) {
return async (req, res, next) => {
// 查询用户权限
const user = await User.findById(req.user.userId).populate('role');
const permissions = user.role.permissions;
// 检查权限
if (!permissions.includes(permission)) {
return res.status(403).json({ error: 'Forbidden' });
}
next();
};
}
// 使用
app.get('/admin', authMiddleware, requirePermission('admin'), (req, res) => {
res.json({ message: 'Welcome admin' });
});测试验证
bash
node test/permission.test.js预期输出
✅ Permission tests passed第 7 课:OAuth 2.0 集成(20 分钟)
学习目标
- 实现 OAuth 2.0 授权服务器
- 实现第三方登录
- 学习令牌管理
课程内容
授权服务器
- 授权端点
- 令牌端点
- 客户端验证
第三方登录
- Google 登录
- GitHub 登录
- 微信登录
令牌管理
- 访问令牌
- 刷新令牌
- 令牌撤销
实践操作
javascript
// OAuth 服务器
app.get('/oauth/authorize', (req, res) => {
// 生成授权码
const code = generateAuthCode(req.query);
// 重定向到客户端
res.redirect(`${req.query.redirect_uri}?code=${code}&state=${req.query.state}`);
});
app.post('/oauth/token', async (req, res) => {
// 验证授权码
const authCode = await validateAuthCode(req.body.code);
// 生成令牌
const accessToken = generateToken(authCode);
const refreshToken = generateRefreshToken(authCode);
res.json({
access_token: accessToken,
refresh_token: refreshToken,
token_type: 'Bearer',
expires_in: 3600
});
});测试验证
bash
node examples/oauth-server.js预期输出
OAuth server running at http://localhost:3000第 8 课:总结与扩展(15 分钟)
学习目标
- 回顾课程内容
- 总结核心概念
- 探索扩展方向
课程内容
课程回顾
- JWT 认证
- OAuth 2.0 授权
- 用户管理
- 权限控制
核心概念总结
- 无状态认证
- 授权流程
- 安全最佳实践
- 性能优化
扩展方向
- 刷新令牌实现
- 多因素认证
- 权限管理
- 会话管理
- 审计日志
实践操作
bash
# 运行所有测试
npm test
# 思考如何扩展功能
# 实现刷新令牌、2FA 等功能预期输出
✅ 所有测试通过学习成果
完成本课程后,你将能够:
- ✅ 理解 JWT 和 OAuth 2.0 的核心概念
- ✅ 实现完整的用户认证系统
- ✅ 掌握权限控制和 RBAC
- ✅ 集成第三方登录
- ✅ 构建安全的 API 接口
参考资源
下一步
完成本课程后,你可以继续学习:
- WebSocket 实时通信
- 微服务架构
- 容器化部署(Docker)
- CI/CD 持续集成
所有教学材料已保存。准备录制。

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