node对前端传过来的token进行解析,shiyong使用jsonwebtoken
1.使用jsonwebtoken
下载:
npm install jsonwebtoken
2.使用jsonwebtoken
jwt.sign(payload, secretOrPrivateKey, [options, callback])
参数说明:
payload
可以是表示有效 JSON 的对象文本、缓冲区或字符串。(一般是用户信息,解析之后可以看到信息,建议生token的时候剔除用户敏感信息,例如登录密码)
secretOrPrivateKey
是一个字符串(utf-8 编码)、缓冲区、对象或 KeyObject,其中包含 HMAC 算法的密钥或 RSA 和 ECDSA 的 PEM 编码私钥。如果私钥带有密码,则可以使用对象 { key, passphrase }
(基于加密文档),在这种情况下,请确保通过该 algorithm
选项。使用 RSA 算法签名时,最小模长度为 2048,除非 allowInsecureKeySizes 选项设置为 true。低于此大小的私钥将被拒绝并显示错误。
简单来说:他就一个密钥,可以自己定义,在一个文件定义好之后,在需要的地方,调用它
options
:
algorithm
(默认值: HS256
)
expiresIn
:以秒或描述时间跨度的字符串表示 vercel/ms。
例如: 60
、 "2 days"
"10h"
"7d"
。数值被解释为秒计数。如果使用字符串,请确保提供时间单位(天、小时等),否则默认使用毫秒单位( "120"
等于 "120ms"
)。
同步签名
// sign with RSA SHA256
var privateKey = fs.readFileSync('private.key');
var token = jwt.sign({ foo: 'bar' }, privateKey, { algorithm: 'RS256' });
异步签名
jwt.sign({ foo: 'bar' }, privateKey, { algorithm: 'RS256' }, function(err, token) {
console.log(token);
});
个人代码例子
const user = {
...results[0],
password: "",
imageUrl: "",
create_time: "",
update_time: "",
};
// 设置token的有效时长
const tokenStr = jwt.sign(user, ‘密钥’, {
expiresIn: "7h",
});
res.send({
results: results[0],
status: 0,
message: "登录成功",
token: "Bearer " + tokenStr,
});
注意:这里为了规范,我返回的token是加了“Bearer ”并且带有空格
接下来是重点
为什么前端返回的token和后端node返回的token一模一样,调用jwt**.**decode
为什么jwt**.**decode(token)返回得到是null
注意:这里我生成和解析token使用的都是jsonwebtoken
原因:因为node后端生成的token是一个字符串,不带有Bearer ,把jwt**.**decode(token)中token去除Bearer
具体上代码
exports.getRoute = (req, res) => {
const token = req.headers.authorization;
const tokens = token.split(" ")[1];
const decoded = jwt.decode(tokens);
let identity = decoded.identity;
let identityRoute = null;
if (identity == "用户") {
identityRoute = userRoute;
} else if (identity == "产品经理") {
identityRoute = productRoute;
} else {
identityRoute = doctorRoute;
}
res.send({
status: 0,
identityRoute: identityRoute,
});
};