OAuth 2.0 和 JWT 授权在 JavaScript 中的介绍
现代 Web 应用程序需要可靠的认证和授权系统。两个最流行的标准——OAuth 2.0(访问委托协议)和 JWT(JSON Web Tokens)——通常一起使用来创建安全的 API。在本文中,我们将从零开始讲解如何在 JavaScript (Node.js) 中实现 OAuth 2.0 和 JWT 授权。
您将了解到:
- 什么是 OAuth 2.0 以及为什么需要它
- JWT 令牌如何工作
- 如何在 Express 上配置授权服务器
- 如何使用中间件保护路由
OAuth 2.0 基础:流程和角色
OAuth 2.0 定义了四个角色:Resource Owner(用户)、Client(应用程序)、Authorization Server(颁发令牌的服务器)和 Resource Server(提供数据的服务器)。最常见的流程是 Authorization Code Grant,用于 Web 应用程序。
在本文中,我们将专注于使用 JWT 实现 Resource Server 和 Authorization Server,而不是外部提供商(Google、GitHub)。这将让您完全控制整个过程。
安装依赖
首先,创建一个新的 Node.js 项目并安装必要的包:
npm init -y
npm install express jsonwebtoken bcrypt dotenv cors
包的说明:
express— 用于创建服务器的框架jsonwebtoken— 创建和验证 JWTbcrypt— 密码哈希dotenv— 处理环境变量cors— 为 API 配置 CORS
在 Node.js 上实现 JWT 授权
JWT 是一个紧凑的令牌,由三部分组成:头部、有效载荷 (payload) 和签名。我们将在用户成功登录后使用它进行身份验证。
配置服务器和用户模型
创建文件 server.js 并定义基本结构:
require('dotenv').config();
const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
const cors = require('cors');
const app = express();
app.use(express.json());
app.use(cors());
const PORT = process.env.PORT || 3000;
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
// 临时用户存储(生产环境中请使用数据库)
const users = [];
注册和密码哈希
注册时,密码应使用 bcrypt 进行哈希处理:
app.post('/api/register', async (req, res) => {
try {
const { email, password } = req.body;
// 检查用户是否已存在
const existingUser = users.find(u => u.email === email);
if (existingUser) {
return res.status(400).json({ message: '用户已存在' });
}
// 密码哈希
const hashedPassword = await bcrypt.hash(password, 10);
const newUser = { id: users.length + 1, email, password: hashedPassword };
users.push(newUser);
res.status(201).json({ message: '用户已创建' });
} catch (error) {
res.status(500).json({ message: '服务器错误' });
}
});
登录和生成 JWT 令牌
验证凭据后,使用 jsonwebtoken 生成令牌:
app.post('/api/login', async (req, res) => {
try {
const { email, password } = req.body;
// 查找用户
const user = users.find(u => u.email === email);
if (!user) {