1. 什么是JWT?
JSON Web Tokens(JWT),是一种基于 JSON 格式的轻便的身份验证和授权机制。JWT在用户与服务器之间传递一些信息,该信息通过数字签名进行验证和信任。
JWT 由三部分组成:头部(header)、负载(payload)和签名(signature)。头部将描述签名的类型和负载的编码类型,负载是 JWT 存储的预期信息,签名是使用密钥创建的哈希。
大多数情况下,JWT 用于在 Web 应用程序中进行身份验证。JWT 将用户的身份信息编码成 JSON,并使用签名确保该信息不被篡改。因此,JWT 中的信息可以是一段简单的身份信息,也可以是关于用户和应用程序的详细信息,如付款历史记录或购物车内容。
2. 在Node.js中使用JWT
2.1 安装jsonwebtoken模块
要在Node.js中使用JWT,您需要安装jsonwebtoken模块。您可以使用npm在您的项目中安装jsonwebtoken,可以通过以下指令进行安装:
npm install jsonwebtoken
2.2 创建JWT
要在Node.js中创建JWT,您需要调用jsonwebtoken 模块的 sign() 方法。sign()方法需要三个参数:
要生成JWT的payload对象
密钥
可选的附加选项对象
以下是一个生成JWT的示例:
const jwt = require('jsonwebtoken');
const payload = {
user_id: 123,
user_name: 'smith',
email: 'smith@example.com'
}
const secretKey = 'your-secret-key';
const token = jwt.sign(payload, secretKey, { expiresIn: '1h' });
console.log(token);
在上述示例中,payload 将是要编码的 JSON。secretKey 是要用于创建 JWT 的密钥。expiresIn 是在生成的 JWT 中指定的到期时间(以秒为单位)。
2.3 验证JWT
要在Node.js中验证JWT,您需要调用jsonwebtoken模块的 verify() 方法。verify() 方法需要两个参数:
您想要验证的jsonwebtoken
密钥
以下示例演示了如何验证JWT:
const jwt = require('jsonwebtoken');
const secretKey = 'your-secret-key';
const token = 'your-json-web-token';
jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
console.log(err);
} else {
console.log(decoded);
}
});
在上述示例中,token 是要验证的 JSON Web Token。如果JWT验证成功,则decoded对象将是使用密钥生成JWT时指定的payload。
2.4 使用中间件实现JWT验证
您可以通过使用中间件将JWT验证逻辑添加到您的Node.js应用程序中。express-jwt是一种流行的中间件,在Express应用程序中使用。
以下是一个使用express-jwt中间件的示例代码:
const express = require('express');
const jwt = require('express-jwt');
const jwks = require('jwks-rsa');
const app = express();
const checkJwt = jwt({
secret: jwks.expressJwtSecret({
cache:true,
rateLimit: true,
jwksRequestsPerMinute: 5,
jwksUri: `your-jwks-uri`
}),
audience: 'your-audience',
issuer: 'your-domain'
});
app.get('/protected_page', checkJwt, (req, res) => {
res.send('This is a protected page!');
});
在上述示例中,checkJwt 是一个中间件函数,它通过密钥从 JWT 中解析负载,并在请求中添加req.user属性。
3. 总结
在Node.js中使用JWT很容易。使用jsonwebtoken模块,您可以轻松地编码和解码JWT数据。您还可以使用中间件将JWT验证逻辑添加到您的应用程序中,从而为您的应用程序提供更多安全性。