node.js配置Token驗(yàn)證的2種方式總結(jié)
1. 生成Token jwt passport實(shí)現(xiàn)生成和驗(yàn)證Token
1.安裝
npm i jsonwebtoken
2.引入
const jwt = require('jsonwebtoken')s3.定義規(guī)則
const rule = {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> id: result[0].id, name: result[0].name }由于id,和name都是通過數(shù)據(jù)庫獲取過來的,所以用的這種方式
4.設(shè)置jwt.sign方法/生成token
jwt.sign("規(guī)則", "加密名字", "過期時(shí)間", "箭頭函數(shù)") jwt.sign(rule, key.secretOrkey, { expiresIn: 3600 }, (err, token) => {
if (err) return err.message
return res.send({
code: 1,
msg: `Bearer ${token}`
})
})
這里的rule就是上面所說的校驗(yàn)規(guī)則,key.secretOrkey就是加密名字,只不過封裝到了外部,expiresIn:3600,就說明是3600秒,msg返回的就是生成的Token
5.驗(yàn)證token
// $router get api/user/current
// @desc return current user
// @access private
router.get("/current", "驗(yàn)證Token", (req, res) => {
res.send({
code: 1,
msg: '驗(yàn)證成功'
})
})
我們需要在"驗(yàn)證Token"那里對Token進(jìn)行驗(yàn)證
2. 使用passpport-jwt||passport驗(yàn)證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);
});
}
));
這個(gè)方法中的User.findOne方法可以刪除,寫上自己的業(yè)務(wù)邏輯,我用的是mysql,所以沒有用User.findeOne方法
初始化passport
app.use(passport.initialize());
passport-jwt
new JwtStrategy(options, verify)
3.實(shí)際使用
index.js(項(xiàng)目入口文件)
const passport = require("passport")
//在入口文件中配置和引用
//初始化passport
app.use(passport.initialize());
require("./config/passport")(passport)
這里單獨(dú)抽離了passport配置文件,同時(shí)將上面引入的passprot進(jìn)行引入
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應(yīng)該帶有統(tǒng)一的格式。一個(gè)正確的token應(yīng)該是這樣的
Bearer ${token},注意Bearer和生成的Token之間的空格。
接下來在需要校驗(yàn)的地方驗(yàn)證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
})
})
驗(yàn)證token如果通過,就會執(zhí)行
passport.use里的方法,同時(shí)jwt_jpayload會輸出結(jié)果,得到結(jié)果后,我們在用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驗(yàn)證Token 安裝
npm install jsonwebtoken express-jwt
注意jsonwebtoken用于生成JWT字符串
express-jwt用于將Jwt字符串解析為JSON對象
新建文件夾config/key.js
module.exports = {
keyOringe: "secret"
}
將設(shè)置的key值暴露出去
在需要的地方引入
const jwt = require("jsonwebtoken") if (password == tools.setPassword(results[0].password)) {
//如果成功,傳1,頁面跳轉(zhuǎn)交給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
})
}
- 調(diào)用 jwt.sign() 方法生成JWT字符串 并通過 token 屬性發(fā)送給客戶端
- 參數(shù)1: 用戶的信息對象
- 參數(shù)2: 加密的密鑰
- 參數(shù)3: 配置對象 可以配置當(dāng)前 token 的有效期
- rule只是抽離出去,其實(shí)直接寫也沒問題
在中間件中使用
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)生的錯誤
當(dāng)使用express-jwt解析Token字符串時(shí),如果客戶端發(fā)送的Token字符串過期或不合法,會產(chǎn)生一個(gè)解析失敗的錯誤,影響項(xiàng)目的正常運(yùn)行,可以通過Express的錯誤中間件,捕獲這個(gè)錯誤并且進(jìn)行相關(guān)的處理,示例代碼如下:
//在所有路由后面定義錯誤中間件
//使用全局錯誤處理中間件 捕獲解析 JWT 失敗后產(chǎn)生的錯誤
app.use((err, req, res, next) => {
//判斷是否由 Token 解析失敗導(dǎo)致的
if (err.name == 'UnauthorizedError') {
return res.send({
status: 401,
message: '無效的Token'
})
}
res.send({
status: 500,
message: '未知的錯誤'
})
})
總結(jié)
到此這篇關(guān)于node.js配置Token驗(yàn)證的2種方式總結(jié)的文章就介紹到這了,更多相關(guān)node.js配置Token驗(yàn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nest.js使用multer實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了Nest.js鵝湖使用multer實(shí)現(xiàn)文件上傳功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
手把手教你用node.js搭建一個(gè)Web服務(wù)
Web服務(wù)器一般指網(wǎng)站服務(wù)器,是指駐留于因特網(wǎng)上某種類型計(jì)算機(jī)的程序,下面這篇文章主要給大家介紹了關(guān)于用node.js搭建一個(gè)Web服務(wù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04
node.js基于express使用websocket的方法
這篇文章主要介紹了node.js基于express使用websocket的方法,結(jié)合實(shí)例形式分析了node.js基于express調(diào)用websocket相關(guān)設(shè)置與使用操作技巧,需要的朋友可以參考下2017-11-11
vscode無法運(yùn)行npm命令的問題解決(cmd可行)
本文主要介紹了vscode無法運(yùn)行npm命令的問題解決(cmd可行),VSCode無法調(diào)用npm可能是因?yàn)榄h(huán)境路徑配置錯誤,下面就來具體介紹一下原因及解決方法,感興趣的可以了解一下2024-04-04
Node.js中path.resolve與path.join的區(qū)別與作用詳解
path.resolve和path.join都是屬于path核心模塊下的方法,用來拼接路徑,下面這篇文章主要給大家介紹了關(guān)于Node.js中path.resolve與path.join的區(qū)別與作用的相關(guān)資料,需要的朋友可以參考下2023-03-03

