node.js配置Token驗證的2種方式總結
1. 生成Token jwt passport實現(xiàn)生成和驗證Token
1.安裝
npm i jsonwebtoken
2.引入
const jwt = require('jsonwebtoken')s
3.定義規(guī)則
const rule = {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> id: result[0].id, name: result[0].name }
由于id,和name都是通過數(shù)據(jù)庫獲取過來的,所以用的這種方式
4.設置jwt.sign方法/生成token
jwt.sign("規(guī)則", "加密名字", "過期時間", "箭頭函數(shù)")
jwt.sign(rule, key.secretOrkey, { expiresIn: 3600 }, (err, token) => { if (err) return err.message return res.send({ code: 1, msg: `Bearer ${token}` }) })
這里的rule就是上面所說的校驗規(guī)則,key.secretOrkey就是加密名字,只不過封裝到了外部,expiresIn:3600,就說明是3600秒,msg返回的就是生成的Token
5.驗證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進行驗證
2. 使用passpport-jwt||passport驗證Token
1.安裝
npm install passport-jwt npm i passport
2.使用
這是從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方法可以刪除,寫上自己的業(yè)務邏輯,我用的是mysql,所以沒有用User.findeOne方法
初始化passport
app.use(passport.initialize());
passport-jwt
new JwtStrategy(options, verify)
3.實際使用
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應該帶有統(tǒng)一的格式。一個正確的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如果通過,就會執(zhí)行
passport.use
里的方法,同時jwt_jpayload會輸出結果,得到結果后,我們在用id在User表中查詢數(shù)據(jù),然后通過req.user(數(shù)據(jù)庫表名)拿到。// { 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 屬性發(fā)送給客戶端
- 參數(shù)1: 用戶的信息對象
- 參數(shù)2: 加密的密鑰
- 參數(shù)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失敗后產(chǎn)生的錯誤
當使用express-jwt解析Token字符串時,如果客戶端發(fā)送的Token字符串過期或不合法,會產(chǎn)生一個解析失敗的錯誤,影響項目的正常運行,可以通過Express的錯誤中間件,捕獲這個錯誤并且進行相關的處理,示例代碼如下:
//在所有路由后面定義錯誤中間件 //使用全局錯誤處理中間件 捕獲解析 JWT 失敗后產(chǎn)生的錯誤 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驗證的2種方式總結的文章就介紹到這了,更多相關node.js配置Token驗證內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用travis-ci如何持續(xù)部署node.js應用詳解
最近在學習使用 travis-ci 對項目進行持續(xù)集成測試,所以下面這篇文章主要給大家介紹了關于使用travis-ci如何持續(xù)部署node.js應用的相關資料,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07Node.js環(huán)境下Koa2添加travis ci持續(xù)集成工具的方法
這篇文章主要給大家介紹了在Node.js環(huán)境下Koa2添加travis ci持續(xù)集成工具的方法,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。2017-06-06在Node.js中使用Express實現(xiàn)視頻評論的列表展示和刪除功能
在現(xiàn)代Web應用中,視頻內容和互動功能(如評論)的結合極大地增加了用戶的參與度,本文將通過一個具體的例子,展示如何在Node.js環(huán)境中使用Express框架來實現(xiàn)視頻評論的列表展示和刪除功能,需要的朋友可以參考下2024-04-04node.js中的querystring.stringify方法使用說明
這篇文章主要介紹了node.js中的querystring.stringify方法使用說明,本文介紹了querystring.stringify的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12