JWT(JSON Web Token)是一种开放标准 (RFC 7519),用于在网络应用环境间安全地将信息作为 JSON 对象传输。它通常用于身份验证和信息交换。JWT 的主要优势在于其简洁性和安全性。
JWT 结构
JWT 由三部分组成,每部分都使用 Base64 编码:
- 头部:包含令牌的类型(即 JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。
- 载荷:包含声明。声明是关于实体(通常是用户)和其他数据的声明。
- 签名:用于验证消息在传输过程中没有被更改,并且,对于使用私钥签名的令牌,它还可以验证 JWT 的发送方是否是它所声称的人。
示例 JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
安装依赖
首先,你需要安装 jsonwebtoken 和 express-jwt 来处理 JWT 相关的操作。
npm install jsonwebtoken express-jwt
创建 JWT
在创建 JWT 之前,需要先定义一个函数来生成 JWT。这个函数将接收用户的 ID、名称等信息,并返回一个 JWT 字符串。
// www.javascriptcn.com code example
const jwt = require('jsonwebtoken');
function generateToken(user) {
const token = jwt.sign(
{ id: user.id, name: user.name },
'your_jwt_secret',
{ expiresIn: '1h' } // 设置过期时间
);
return token;
}
// 使用示例
const user = { id: 1, name: 'John Doe' };
const token = generateToken(user);
console.log(token);验证 JWT
为了验证 JWT,你需要创建一个中间件来检查请求中的 JWT 是否有效。
// www.javascriptcn.com code example
const express = require('express');
const app = express();
const jwt = require('jsonwebtoken');
app.use(express.json());
app.post('/login', (req, res) => {
const user = { id: 1, name: 'John Doe' };
const token = generateToken(user);
res.json({ token });
});
app.use((req, res, next) => {
const token = req.headers['authorization'];
if (!token) return res.status(401).send({ auth: false, message: 'No token provided.' });
jwt.verify(token, 'your_jwt_secret', function(err, decoded) {
if (err) return res.status(500).send({ auth: false, message: 'Failed to authenticate token.' });
// 如果成功验证,将解码后的用户信息添加到请求对象
req.userId = decoded.id;
next();
});
});
app.get('/protected', (req, res) => {
res.send(`Hello ${req.userId}`);
});
app.listen(3000, () => console.log('Server running on port 3000'));处理错误
在实际应用中,你需要处理各种可能出现的错误,例如无效的 JWT、JWT 已过期或 JWT 签名不匹配等问题。你可以通过捕捉异常来处理这些错误,并向客户端返回适当的响应。
app.use((err, req, res, next) => {
if (err.name === 'UnauthorizedError') {
res.status(401).send({ auth: false, message: 'Invalid token.' });
} else {
res.status(500).send({ error: 'Internal server error' });
}
});总结
通过上述步骤,你已经了解了如何在 Node.js 应用程序中使用 JWT。JWT 是一种非常方便且强大的工具,可以用于保护你的 API 并确保只有经过授权的用户才能访问受保护的资源。希望本教程能帮助你在实际项目中更有效地使用 JWT。