在现代 web 应用程序中,身份验证和授权是两个非常重要的方面。JSON Web Tokens(JWT)为这些功能提供了一种标准的方法。在 Node.js 中实现 JWT 身份验证和授权,我们通常会使用 jsonwebtoken
库来生成和验证 JWT。本文将介绍如何在 Node.js 应用程序中实施 JWT 身份验证和授权,并提供相应的代码示例。
什么是 JWT?
JWT 是一种开放标准(RFC 7519),它定义了一种简洁的、自包含的方法,用于在各方之间安全地传输信息。JWT 由三部分组成: 1. Header(头部) 2. Payload(有效载荷) 3. Signature(签名)
这三部分通过句点(.
)连接在一起,形成一个字符串。例如:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
安装依赖
在开始编写代码之前,确保你已经安装了 Node.js 和 npm。然后创建一个新的项目,并安装必要的依赖:
mkdir jwt-auth-example
cd jwt-auth-example
npm init -y
npm install express jsonwebtoken body-parser
创建服务器
以下是一个简单的 Express 服务器示例,它实现了 JWT 身份验证和授权。
const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
const PORT = 3000;
const SECRET_KEY = 'your_secret_key'; // 替换成你的密钥
// 用户数据示例
const users = [
{ id: 1, username: 'user1', password: 'password1' },
{ id: 2, username: 'user2', password: 'password2' }
];
// 登录路由
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (!user) {
return res.status(401).send('用户名或密码错误');
}
// 用户身份验证通过,生成 JWT
const token = jwt.sign({ id: user.id, username: user.username }, SECRET_KEY, { expiresIn: '1h' });
return res.json({ token });
});
// 中间件:验证 JWT
function authenticateToken(req, res, next) {
const token = req.headers['authorization'] && req.headers['authorization'].split(' ')[1];
if (!token) return res.sendStatus(401);
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
}
// 受保护的路由
app.get('/protected', authenticateToken, (req, res) => {
res.json({ message: '这是一个受保护的路由', user: req.user });
});
// 启动服务器
app.listen(PORT, () => {
console.log(`服务器运行在 http://localhost:${PORT}`);
});
代码解析
- 登录接口:用户通过 POST 请求
/login
提交用户名和密码。服务器会校验这些信息,如果成功登录,则生成 JWT 并返回给客户端。 - JWT 验证中间件:
authenticateToken
函数是一个中间件,用于验证传入请求中的 JWT。它会检查请求头中的Authorization
字段,并验证 token 的有效性。 - 受保护的路由:通过
authenticateToken
中间件保护的/protected
路由,只有通过验证的用户才能访问。
测试接口
- 使用 Postman 或者其他工具发送 POST 请求到
/login
,提供用户名和密码。 - 将返回的 token 存储起来。
- 发送 GET 请求到
/protected
,在请求头中添加Authorization: Bearer your_token
。
总结
在这篇文章中,我们实现了一个简单的 JWT 身份验证和授权系统。JWT 为我们提供了一种轻量级的方式来保护 API,确保只有经过身份验证的用户才能访问受保护的资源。在真实的应用中,记得使用 HTTPS、加密存储密码等最佳实践,以提高安全性。