NodeJs使用jwt生成token以及使用express-jwt校验和解密token
/注:校验token,获取headers⾥里里的Authorization的token方法,要写在路由加载之前,静态资源之后
1 2 3 4 5 | app.use(expressJWT({ secret: PRIVATE_KEY }).unless({ path: [ '/api/user/register' , '/api/user/login' ] //⽩白名单,除了了这⾥里里写的地址,其他的URL都需要验证 })); |
一、生成token
1、安装jsonwebtoken
1 | npm install jsonwebtoken -S |
2、在公共文件中定义一个秘钥和过期时间(单位是秒)
1 2 3 4 | module.exports = { "PRIVITE_KEY" : "我是秘钥" , "EXPIRESD" :60*60*24 } |
3、在需要生成token的页面引入jsonwebtoken(路由页面)
1 2 3 4 5 6 | // jwt生成token var {PRIVITE_KEY,EXPIRESD} = require( "../utils/store" ) const jwt = require( "jsonwebtoken" ); //jwt.sign()方法可生成token,第一个参数写的用户信息进去(可以写其他的),第二个是秘钥,第三个是过期时间 let token = jwt.sign({username},PRIVITE_KEY,{expiresIn:EXPIRESD}); |
二、校验和解密token(此方法写在静态资源加载之后,不然静态资源不能访问))
1、安装express-jw
1 | npm install express-jwt |
2、校验token,获取headers⾥里里的Authorization的token
1 | 前端token值格式 Bearer+token 这是express-jwt规定的前端格式 |
1 2 3 4 5 6 7 8 9 | 在入口文件app.js中引入express-jw以及token加密时使用的秘钥 const expressJWT = require( 'express-jwt' ); var { PRIVITE_KEY } = require( "./utils/store" ); //使用此方法拦截所有请求看token是否正确(此方法写在静态资源加载之后,不然静态资源不能访问) app.use(expressJWT({ secret: PRIVATE_KEY }).unless({ path: [ '/api/user/register' , '/api/user/login' ] //⽩白名单,除了了这⾥里里写的地址,其他的URL都需要验证 }));在app.js中的错误中间件定义token的处理 |
// error handler
app.use(function (err, req, res, next) {
if (err.name === 'UnauthorizedError') {
// 这个需要根据⾃自⼰己的业务逻辑来处理理
res.status(401).send({code:-1,msg:'token验证失败'});
}else {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
}
});
在路由接口中可以使用req.user拿到token解密的值
路由页面如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | var express = require( 'express' ); var router = express.Router(); var querySql = require( "../db/index" ); // md5加密key和方法 var {key} = require( '../utils/store' ); var {md5} = require( "../utils/index" ) // jwt生成token var {PRIVITE_KEY,EXPIRESD} = require( "../utils/store" ) const jwt = require( "jsonwebtoken" ); // 登录接口 router.post( "/login" ,async (req,res,next) => { try { // 对应前台的传参 let {username,password} = req.body; // 跟数据库对应,看是否存在当前用户 password = md5(`${password}${key}`); let result = await querySql( "select * from user where username = ? and password = ?" ,[username,password]); if (result && result.length != 0){ // 数据库有当前用户时返回token let token = jwt.sign({username},PRIVITE_KEY,{expiresIn:EXPIRESD}); res.send({ code:0, msg: "登录成功" , token:token }) } else { res.send({ code:-1, msg: "用户名或者密码错误" }) } } catch (error) { // p抛出异常并交由错误中间件处理 console.log(error); next(error); } }) // 注册接口 router.post( '/register' , async (req, res, next)=>{ let { username, password, nickname } = req.body; try { // 查询当前用户名在不在数据库中(使用async方法后必须使用await方法才有值返回,不然返回promise对象) let user = await querySql( "select * from user where username = ?" , [username]); // 存在res即是数据库中有数据 if (user && user.length != 0) { res.send({ code: -1, msg: "用户已注册" }) } else { // 对密码进行加密 password = md5(`${password}${key}`); // async 和 await 向数据库插入数据 await querySql( "insert into user(username,password,nickname) values (?,?,?)" , [username, password, nickname]); res.send({ code: 0, msg: "注册成功" }) } } catch (error) { console.log(error) next(error) } }); // 查询用户信息接口 router.get( "/info" ,async (req,res,next)=>{ // 通过username获取用户信息 console.log(req.user) let {username} = req.body; try { let userInfo = await querySql( "select * from user where username = ?" ,[username]); res.send({ code:0, userInfo:userInfo }) } catch (error) { console.log(error); next(error); } }) module.exports = router; |
app.js写法如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | var createError = require( 'http-errors' ); var express = require( 'express' ); var path = require( 'path' ); var cookieParser = require( 'cookie-parser' ); var logger = require( 'morgan' ); var cors = require( "cors" ); // 使用express-jwt来进行token的解密和验证 const expressJWT = require( 'express-jwt' ); var { PRIVITE_KEY } = require( "./utils/store" ); var indexRouter = require( './routes/index' ); var usersRouter = require( './routes/users' ) var app = express(); // view engine setup app.set( 'views' , path.join(__dirname, 'views' )); app.set( 'view engine' , 'jade' ); // 处理跨域 app.use(cors()) // 日志 app.use(logger( 'dev' )); // 使用post请求 app.use(express.json()); app.use(express.urlencoded({ extended: false })); // 使用cookie app.use(cookieParser()); // 访问静态资源目录 app.use(express. static (path.join(__dirname, 'public' ))); // 校验token,获取headers⾥里里的Authorization的token,要写在路由加载之前,静态资源之后 app.use(expressJWT({ secret: PRIVITE_KEY }).unless({ path: [ '/api/user/register' , '/api/user/login' ] //⽩白名单,除了了这⾥里里写的地址,其他的URL都需要验证 })); // 使用路由 app.use( '/' , indexRouter); app.use( '/api/user' , usersRouter); // catch 404 and forward to error handler app.use( function (req, res, next) { next(createError(404)); }); // error handler app.use( function (err, req, res, next) { if (err.name === 'UnauthorizedError' ) { // 这个需要根据⾃自⼰己的业务逻辑来处理理 res.status(401).send({code:-1,msg: 'token验证失败' }); } else { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get( 'env' ) === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render( 'error' ); } }); module.exports = app; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)