【node】token的生成与解析配置
在用户登录成功之后为了记录用户的登录状态通常会将用户信息编写为一个token,通过解析token判断用户是否登录。
token的生成
JSON Web Token(JWT) 是一种基于JSON的轻量级身份验证和授权机制。它是一种开放标准(RFC 7519),用于在网络应用中传递声明。
1 安装
npm i jsonwebtoken
2 引入jwt
const jwt = require(“jsonwebtoken”);
3 使用jwt,生成token
const jwt = require("jsonwebtoken");
// 获取secret秘钥
const config = require("../config.js");
const expiresIn = '1h' // token有效期// 对用户信息进行加密 生成token
const generateToken = (user) => {const token = jwt.sign({user_id: user.id,role: user.role,},config.SECRET_KEY,{ expiresIn:expiresIn });return 'Bearer ' + token;
};
4 对用户信息进行token化处理
对用户信息处理的时候,推荐将用户密码与头像信息去掉
// 登录
exports.login = (req, res) => {const userinfo = req.body;if (!userinfo.username || !userinfo.password) {return res.send({message: "用户名或者密码不能为空!",status: 0,});}const sqlStr = `select * from user where username=?`;db.query(sqlStr, [userinfo.username], (err, results) => {if (err) {res.handleResult(err.message);} else if (results.length > 0) {const password = results[0].password;const isExit = bcrypt.compareSync(userinfo.password, password);if (isExit) {// 对用户信息处理的时候,推荐将用户密码与头像信息去掉const user = { ...results[0], password: "", avatar: "" };// 生成tokenconst token = generateToken(user);res.handleResult("登录成功!", 0,token);} else {res.handleResult("密码不正确!");}} else {res.handleResult("用户不存在!");}});
};
解析token
1 安装
npm i express-jwt@5.3.3
2 引入expressJWT
const expressJWT = require(“express-jwt”);
3 使用expressJWT,解析token
需要注意的是token解析配置,必须在路由配置前设置
const expressJWT = require('express-jwt')
const config = require('./config')// 配置token解析
// unless中的path 除了这个地址,其他的URL都需要验证token
app.use(expressJWT({secret: config.SECRET_KEY}).unless({path: ['/api/login'] }));
问题描述
在使用express-jwt的过程中遇到了如下问题
该问题由 6.0.0 版本 更改
引起。
方案一: 配置algorithms参数
在提供第三方库作为机密时,需要 algorithms 参数来防止潜在的降级攻击。
expressJwt({ secret: config.SECRET_KEY, algorithms: ['RS256'] });
方案二: 降低express-jwt的版本
npm i express-jwt@5.3.3