在node.js中配置Token验证的两种方式
2022/8/13 14:25:11
本文主要是介绍在node.js中配置Token验证的两种方式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1. 生成Token jwt passport实现生成和验证Token
jsonwebtoken
- 安装
npm i jsonwebtoken
- 引入
const jwt = require('jsonwebtoken')s
- 定义规则
const rule = { id: result[0].id, name: result[0].name }
由于id,和name都是通过数据库获取过来的,所以用的这种方式
- 设置jwt.sign方法/生成token
jwt.sign("规则", "加密名字", "过期时间", "箭头函数")
jwt.sign(rule, key.secretOrkey, { expiresIn: 3600 }, (err, token) => { if (err) return err.message return res.send({ code: 1, msg: `Bearer ${token}` }) })
这里的rule就是上面所说的校验规则,key.secretOrkey就是加密名字,只不过封装到了外部,expiresIn:3600,就说明是3600秒,msg返回的就是生成的Token
- 验证token
// $router get api/user/current // @desc return current user // @access private router.get("/current", "验证Token", (req, res) => { res.send({ code: 1, msg: '验证成功' }) })
我们需要在"验证Token"那里对Token进行验证
7. 使用passpport-jwt||passport验证Token
passport
passport-jwt
- 安装
npm install passport-jwt npm i passport
- 使用
这是从npm摘抄过来的的示例方法
passport
passport.use(new LocalStrategy( function(username, password, done) { User.findOne({ username: username }, function (err, user) { if (err) { return done(err); } if (!user) { return done(null, false); } if (!user.verifyPassword(password)) { return done(null, false); } return done(null, user); }); } ));
这个方法中的User.findOne方法可以删除,写上自己的业务逻辑,我用的是mysql,所以没有用User.findeOne方法
初始化passport
app.use(passport.initialize());
passport-jwt
new JwtStrategy(options, verify)
- 实际使用
index.js(项目入口文件)
const passport = require("passport") //在入口文件中配置和引用 //初始化passport app.use(passport.initialize()); require("./config/passport")(passport)
这里单独抽离了passport配置文件,同时将上面引入的passprot进行引入
config/passport.js
const db = require("../db/index") const JwtStrategy = require('passport-jwt').Strategy const ExtractJwt = require('passport-jwt').ExtractJwt const key = require("../config/key") const opts = {} opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken(); opts.secretOrKey = key.secretOrkey; module.exports = passport => { passport.use(new JwtStrategy(opts, (jwt_payload, done) => { // { id: 1, name: 'wz', iat: 1660299838, exp: 1660303438 } console.log(jwt_payload); sqlcc = `SELECT * FROM user WHERE id=${jwt_payload.id};` db.query(sqlcc, (err, result) => { console.log(result[0]); if (err) { return done(null, err.message) } if (result.length != 0) { return done(null, result[0]) } else { return done(null, false) } }) })); }
注意,生成的token应该带有统一的格式。一个正确的token应该是这样的
Bearer ${token}
,注意Bearer和生成的Token之间的空格。
接下来在需要校验的地方验证Token
// $router get api/user/current // @desc return current user // @access private router.get("/current", passport.authenticate("jwt", { session: false }), (req, res) => { res.send({ code: 1, msg: req.user }) })
验证token如果通过,就会执行
passport.use
里的方法,同时jwt_jpayload会输出结果,得到结果后,我们在用id在User表中查询数据,然后通过req.user(数据库表名)拿到。// { id: 1, name: 'wz', iat: 1660299838, exp: 1660303438 } console.log(jwt_payload);
2. express-jwt || jsonwebtoken生成Token验证Token
- 安装
npm install jsonwebtoken express-jwt
注意
jsonwebtoken用于生成JWT字符串
express-jwt用于将Jwt字符串解析为JSON对象
- 新建文件夹config/key.js
module.exports = { keyOringe: "secret" }
将设置的key值暴露出去
- 在需要的地方引入
const jwt = require("jsonwebtoken")
if (password == tools.setPassword(results[0].password)) { //如果成功,传1,页面跳转交给vue + const rule = { + id: results[0].id, + adminname: results[0].adminname + } + const tokenstr = jwt.sign(rule, key.keyOringe, { expiresIn: 3600 }) + res.send({ code: 1, msg: '登陆成功', + token: tokenstr }) }
- 调用 jwt.sign() 方法生成JWT字符串 并通过 token 属性发送给客户端
- 参数1: 用户的信息对象
- 参数2: 加密的密钥
- 参数3: 配置对象 可以配置当前 token 的有效期
- rule只是抽离出去,其实直接写也没问题
在中间件中使用
const { expressjwt: jwt } = require("express-jwt") const key = require('../config/key') router.use(jwt({ secret: key.keyOringe, algorithms: ["HS256"], }).unless({ path: ["/admin/login", "/admin/register"] }) )
之后使用私有接口去访问
//$route GET admin/banner/ //@desc 修改轮播图接口 router.get('/', (req, res) => { console.log(req); res.send({ code: 1, msg: '获取用户信息成功', data: req.auth }) })
这样就会返回带有用户信息的Token了!
捕获解析JWT失败后产生的错误
当使用express-jwt解析Token字符串时,如果客户端发送的Token字符串过期或不合法,会产生一个解析失败的错误,影响项目的正常运行,可以通过Express的错误中间件,捕获这个错误并且进行相关的处理,示例代码如下:
//在所有路由后面定义错误中间件 //使用全局错误处理中间件 捕获解析 JWT 失败后产生的错误 app.use((err, req, res, next) => { //判断是否由 Token 解析失败导致的 if (err.name == 'UnauthorizedError') { return res.send({ status: 401, message: '无效的Token' }) } res.send({ status: 500, message: '未知的错误' }) })
这篇关于在node.js中配置Token验证的两种方式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-19vue2 开发移动端h5 使用那个ui框架比较好?-icode9专业技术文章分享
- 2024-11-19ReactJS结合TypeScript、Vite、Redux和TanStack (React Query) 实战教程
- 2024-11-19Vue3资料入门教程:零基础快速上手指南
- 2024-11-19Vue3资料:新手入门教程与实战指南
- 2024-11-19Vue资料:新手入门vue.js教程与实践指南
- 2024-11-19Vue资料:初学者入门指南
- 2024-11-18tcpdf可以等待vue动态页面加载完成后再生成pdf吗?-icode9专业技术文章分享
- 2024-11-16Vue3资料:新手入门必读教程
- 2024-11-16Vue3资料:新手入门全面指南
- 2024-11-16Vue资料:新手入门完全指南