最近的項目需要在node服務端做一個用戶登錄的校驗以及權限攔截,專業一點叫用戶認證與授權,經過一番收集資料,目前常用的有兩種――JWT和Session
使用JWT
JWT是JsonWebTokens的簡寫形式,具體是啥我就不詳細寫了,可以查看資料。
這里引入兩個插件,express-jwt和JsonWebTokens,-
express-jwt內部引用了jsonwebtoken,對其封裝使用。使用JWT形式進行認證與授權的思路如下。
jwt認證流程
在服務端中使用方式如下:
//安裝npm i jsonwebtoken --savenpm i express-jwt --save//引入const jwt= require('jsonwebtoken');const expressJwt = require('express-jwt');//定義簽名const secret = 'salt';//生成tokenconst token = jwt.sign({ name: 123}, secret, { expiresIn: 60 //秒到期時間});//生成的token//eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoxMjMsImlhdCI6MTQ5MTQ3NTQyNCwiZXhwIjoxNDkxNDc1NDg0fQ.hYNC4qFAyhZClmPaLixfN137d41R2CFk1xPlfLK10JU//使用中間件驗證token合法性app.use(expressJwt ({ secret: secret }).unless({ path: ['/login', '/getUserInfo'] //除了這些地址,其他的URL都需要驗證}));//攔截器app.use(function (err, req, res, next) { //當token驗證失敗時會拋出如下錯誤 if (err.name === 'UnauthorizedError') { //這個需要根據自己的業務邏輯來處理( 具體的err值 請看下面) res.status(401).send('invalid token...'); }});//定義一個接口,返回token給客戶端app.get('/getUserInfo', function(req, res) { res.json({ token: token })})
客戶端中使用token的正確形式應該是把token放在authorization 這個header里, 對應的值以Bearer
開頭然后空一格
authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiQmluTWFpbmciLCJkYXRhIjoiPT09PT09PT09PT09PSIsImlhdCI6MTUwMTgxNDE4OCwiZXhwIjoxNTAxODE0MjQ4fQ.GoxGlc6E02W5VvqDNawaOrj3MPO-4UYeFdngKR4bVTE//采用axios可以這么寫const instance = axios.create();const yourToken = 'sfsgagfdgd';//設置請求攔截器instance.interceptors.request.use(function(config) { config.headers.authorization = `Bearer ${yourToken}` return config;})
使用Session
傳統的認證和用戶識別分別采用如下形式
這里使用cookie的方式需要引入兩個插件:
使用思路和JWT差不多,這里主要的區別在于客戶端請求資源時不用手動在http請求的header添加標識,瀏覽器會自動加上cookie,具體使用方式如下
var express = require('express');var cookieParser = require('cookie-parser');var session = require('express-session'); app.use(cookieParser('sessiontest'));app.use(session({ secret: 'sessiontest',//與cookieParser中的一致 resave: true, //(是否允許)當客戶端并行發送多個請求時,其中一個請求在另一個請求結束時對session進行修改覆蓋并保存。 rolling: true, //強制在每個響應中重設cookie的過期時間,并重新開始計時 saveUninitialized:true, //初始化session時是否保存到存儲。默認為true, 但是(后續版本)有可能默認失效,所以最好手動添加。 cookie: { maxAge: 60 * 1000 //過期時間,單位毫秒 }}));/** * 資源請求攔截器 * 用戶端若登錄狀態過期或未登錄則自動拋出錯誤 */app.use(function(req, res, next) { let url = req.originalUrl; req.session.touch(); //刷新session過期時間 if (url !== '/login' && !req.session.user) { res.status(401).send('登錄狀態已過期'); return } next();})
對比
作為一個實踐派人士,我把兩種都試了一遍,同時結合網上的博客歸納了如下對比
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答