📅  最后修改于: 2023-12-03 15:06:49.042000             🧑  作者: Mango
JWT (JSON Web Tokens) 是一种轻量级的身份验证方式,可以在 Web 应用程序中用于安全地传输信息。JWT 包含有关用户身份验证和授权信息的数字签名,以确保传输过程中的数据完整性和安全性。在 Node.js 中,可以使用 jsonwebtoken
模块来生成和验证 JWT。
jsonwebtoken
使用以下命令安装 jsonwebtoken
模块:
npm install jsonwebtoken --save
使用以下代码示例创建 JWT:
const jwt = require('jsonwebtoken');
const secret = 'YourSecretKey';
const payload = { username: 'exampleUser' };
const token = jwt.sign(payload, secret, { expiresIn: '1h' });
console.log(token);
在此示例中,我们使用 jsonwebtoken
模块的 sign
方法生成 JWT。 payload
对象是要包含在 JWT 中的信息。 secret
参数是用于加密 JWT 的密钥。 expiresIn
参数指定 JWT 的有效期时间(这里是 1 小时)。
输出将是包含 JWT 的字符串。
使用以下代码示例验证 JWT:
const jwt = require('jsonwebtoken');
const secret = 'YourSecretKey';
const token = 'YourJWTToken';
jwt.verify(token, secret, (err, decoded) => {
if (err) {
console.log('Token Verification Failed');
console.log(err);
} else {
console.log('Token Verified');
console.log(decoded);
}
});
在此示例中,我们使用 jsonwebtoken
模块的 verify
方法验证 JWT。 token
参数是要验证的 JWT 字符串。 secret
参数是用于解密 JWT 的密钥。
verify
方法将检查 JWT 是否已签名,并验证签名'是否与密钥匹配。 如果 JWT 验证成功,则将调用回调函数,并将解码的 JWT 数据作为参数传递给它。
在 Web 应用程序中,通常会将 JWT 存储在客户端(例如,浏览器的 localStorage),然后在每个 HTTP 请求中通过 HTTP 标头发送它。服务器将会验证 JWT,以确认请求时的用户身份验证和授权信息。
例如,以下代码片段演示了如何使用 JWT 进行 Express.js 中间件身份验证:
const jwt = require('jsonwebtoken');
const secret = 'YourSecretKey';
function authenticate(req, res, next) {
const token = req.headers.authorization;
if (!token) {
res.status(401).send('Unauthorized: No token provided');
} else {
jwt.verify(token, secret, (err, decoded) => {
if (err) {
res.status(401).send('Unauthorized: Invalid token');
} else {
req.username = decoded.username;
next();
}
});
}
}
app.get('/protected', authenticate, (req, res) => {
res.send(`Welcome ${req.username}!`);
});
在此示例中,中间件 authenticate
将验证 HTTP 请求标头中的 JWT。如果 JWT 有效,则将用户的 username
添加到请求对象,并将请求传递给下一个中间件。否则,将发送未授权错误消息。在 /protected
路由中,req.username
将包含验证的用户身份验证信息并在响应中使用。