在用戶登錄成功之后為了記錄用戶的登錄狀態通常會將用戶信息編寫為一個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