如何实现基于Node的JWT鉴权机制?最近好像都在问这道面试题
下面是基于 Node.js 的 JWT 鉴权机制的一般步骤。可以根据实际需求进行调整和扩展。
仅供参考:
1.安装所需的库
在 Node.js 中使用 JWT 需要安装 jsonwebtoken 库。可以使用 npm 包管理器在项目中安装该库:
npm install jsonwebtoken
2.创建 JWT
在用户登录成功后,可以创建一个 JWT 并将其返回给客户端。可以使用 jsonwebtoken 库的 sign() 方法创建 JWT
const jwt = require('jsonwebtoken');
const payload = { id: user.id, username: user.username };
const secretKey = 'mysecretkey';
const token = jwt.sign(payload, secretKey, { expiresIn: '1h' });
其中 payload 是包含用户信息的对象,secretKey 是用于签名的密钥,expiresIn 是 JWT 的有效期。该方法将返回一个 JWT 字符串。
3.验证 JWT
在客户端发送请求时,可以将 JWT 包含在请求头中,例如:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTYyMTQ2NTMzOCwiZXhwIjoxNjIxNDY5NzM4fQ.bUw6aIz7VrJXm2Q7bhCThrdvpZf6cC-6UX3q7pJU77A
可以使用 jsonwebtoken 库的 verify() 方法验证 JWT:
const token = req.headers.authorization.split(' ')[1];
const secretKey = 'mysecretkey';
jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
res.status(401).json({ error: 'Unauthorized' });
} else {
req.user = decoded;
next();
}
});
其中 token 是从请求头中获取的 JWT,secretKey 是用于签名的密钥。该方法将验证 JWT 的签名和有效期,并将解码后的信息存储在 decoded 变量中,其中包含用户信息等。如果验证成功,则调用 next() 函数继续处理请求,否则返回 401 Unauthorized 错误。
不知道你这个问题是否已经解决, 如果还没有解决的话:既然Token是对Http协议的一个补充,可以说代替Cookie,那么Token也是要存储用户信息的,而在cookie中都是以键值对形式存储的:比如(name=‘lgh’; )一定是以分号加一个空格结尾,而Token一般是服务端返回给客户端的一个JSON,但是我们与服务端通信的时候,往往这个JSON会加上签名(也就是一串你不认识的英文,服务端认识)。