電商項目中的用戶token中間件

let encryptUtil = require("../utils/encryptUtil");

let config = require("../config");

let userService = require("../service/user");

function checkUrl(url) {

? ? // 不需要登錄

? ? // 注冊 : /user/regist

? ? // 登錄 : /user/login

? ? let ignoreUrls = [

? ? ? ? /\/user\/regist/,

? ? ? ? /\/user\/login/

? ? ];

? ? // /user/login

? ? // 標志位,當前的url是否需要進行登錄狀態(tài)的校驗,默認值是需要

? ? let isNeedCheck = true;

? ? // js中的forEach()是不能中斷的,break

? ? for (let i = 0; i < ignoreUrls.length; i++) {

? ? ? ? let ignoreUrl = ignoreUrls[i];

? ? ? ? if (ignoreUrl.test(url)) {

? ? ? ? ? ? isNeedCheck = false;

? ? ? ? ? ? break;

? ? ? ? }

? ? }

? ? return isNeedCheck;

}

// 校驗用戶是否已經(jīng)登錄

module.exports = async (request, response, next) => {

? ? // 用戶請求的路徑

? ? let url = request.url;

? ? // 用戶請求的url是需要進行登錄狀態(tài)的校驗

? ? if (checkUrl(url)) {

? ? ? ? // 獲取token

? ? ? ? let token = request.get("token");

? ? ? ? if (!token) {

? ? ? ? ? ? throw? Error("請求頭中沒有Token數(shù)據(jù),請登錄");

? ? ? ? }

? ? ? ? // 解密出來的是json字符串,不是js對象,所以不能通過.屬性名的方式獲取到屬性值

? ? ? ? let tokenDecrypted = null;

? ? ? ? try {

? ? ? ? ? ? tokenDecrypted = encryptUtil.aesDecrypt(token, config.TOKEN_KEY);

? ? ? ? } catch (e) {

? ? ? ? ? ? throw? Error("token解密失敗,請登錄");

? ? ? ? }

? ? ? ? // 把json字符串轉成js對象

? ? ? ? let tokenJs = JSON.parse(tokenDecrypted);

? ? ? ? // 獲取token的有效期

? ? ? ? let expire = tokenJs.expire;

? ? ? ? if (Date.now() > expire) {

? ? ? ? ? ? throw? Error("token已過期,請重新登錄");

? ? ? ? }

? ? ? ? // 獲取token中的用戶名

? ? ? ? let username = tokenJs.username;

? ? ? ? // 根據(jù)用戶名查詢用戶

? ? ? ? let user = await userService.findByUsername(username);

? ? ? ? // 如果查詢不到,說明token是偽造的

? ? ? ? if (!user) {

? ? ? ? ? ? throw? Error("token無效,請重新登錄");

? ? ? ? }

? ? ? ? // 把查詢到的用戶存儲到request對象身上

? ? ? ? request.user = user;

? ? }

? ? // 放行的代碼

? ? next();

}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,662評論 19 139
  • Overview The ccxt library is a collection of available cr...
    郭蟈兒蟈兒閱讀 4,026評論 0 1
  • Web框架之Django: (1)簡介: Django是一個由Python寫成開源的重量級Web應用框架,采用MT...
    老肖閱讀 3,167評論 0 18
  • 每個人都是情感大師,只是側重點各不相同。 有的人醉心于對事業(yè)執(zhí)著的追求,有的人耽溺在愛情的漩渦中不能自拔,還有的人...
    擰巴哥閱讀 1,130評論 0 0
  • 上大學之后,要學的第一課就是怎樣照顧好自己。 我記得去年剛開學不久,我借著媽媽生日的機會給爸媽寄了明信片,交代了一...
    小木山莊的溜溜閱讀 6,537評論 22 80

友情鏈接更多精彩內(nèi)容