摘要:權限控制業務需求查看用戶列表接口管理員才能使用更新用戶信息接口當前對應用戶才能調用這時候需要需要加入中間件來實現權限控制這時候咱們需要學習了解下課前學習了解入門教程基于的認證版實現本文中使用了插件現將服務邏輯代碼附上服務配置設置創
權限控制
業務需求:查看用戶列表接口(管理員才能使用)、更新用戶信息接口(當前對應用戶才能調用)
這時候需要需要加入中間件來實現權限控制:
這時候咱們需要學習了解下 :AccessToken jwt
AccessToken jwt課前學習了解
JSON Web Token 入門教程
http://www.ruanyifeng.com/blo...
基于jsonwebtoken(JWT) 的web認證 (Node版實現)
https://segmentfault.com/a/11...
node-jsonwebtoken
https://github.com/auth0/node...
本文中使用了node-jsonwebtoken@7.2.1插件
現將token服務邏輯代碼附上
/** * token服務 * add by boomer 2019-05-03 21:57:11 */ var Promise = require("bluebird"); var config = require("config-lite"); //配置 var jwt = require("jsonwebtoken"); //json token module.exports = { /** * 設置token 創建token */ setToken: function(payload) { // var expiresIn = Math.floor(Date.now() / 1000) + (1 * 60); // var expiresIn = "24h"; var expiresIn = Date.now() + 3600000 * 24;//24小時后 var token = jwt.sign(payload, config.token.secretOrPrivateKey, { expiresIn: expiresIn, // 設置過期時間 }); return { token: token, expiresIn: expiresIn, }; }, /** * 驗證token是否正確:傳入當前token和當前用戶uuid */ verifyToken: function(token, userUuid){ return new Promise(function(resolve, reject) { jwt.verify(token, config.token.secretOrPrivateKey, function(err, tokenData) { if (tokenData && tokenData.uuid == userUuid) { resolve("ok"); }else{ reject("fail"); } }); }); }, /** * 路由驗證token */ verifyRouterToken: function(req, res, next, isAdmin) { //accesstoken 被自動轉小寫了 var token = req.headers.accesstoken; if (!token) { // 如果沒有token,則返回錯誤 res.json({ code: "401", }); return; } else { //驗證token jwt.verify(token, config.token.secretOrPrivateKey, function(err, tokenData) { //只有在token正確時tokenData有值 if (err) { res.json({ code: "402", }); return; } else { //驗證是否為管理員 if (isAdmin && !tokenData.isAdmin) { res.json({ code: "403", }); return; } else if (!isAdmin && tokenData.uuid && !tokenData.isAdmin) { //驗證userUuid 避免普通用戶登錄修改其他人資料 var userUuid = (req.body || req.query || req.params)["userUuid"]; if (userUuid && userUuid != tokenData.uuid) { res.json({ code: "403", }); return; } else { next(); } } else { next(); } } }); } }, /** * 清除token */ delToken: function(token) { if (!token) { return "delTokenFail"; } else { jwt.decode(token); return "delTokenSuccess"; } }, };
accessToken一般在登錄/注冊成功時獲取 然后緩存到本地,每次前端請求時將有效的accessToken放到headers中(這塊后面寫前端時補充 更新token心跳機制等),然后請求到后端,后端再通過校驗token中間件做權限攔截,校驗通過后才能執行后面的業務邏輯
現在說下,后端通過上面tokenService.setToken方法 生成AccessToken的代碼:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/104076.html
摘要:多一個技能多一條出路,祝你在自學道路上越走越好,掌握自己的核心技能,不只是優秀,還要成為不可替代的人 NodeJs+Express+Mysql + Vuejs 項目實戰 最近準備寫一系列文章,全面講述如何基于NodeJs + Express + Mysql + Vuejs 從零開發前后端完全分離項目; 文筆及技術可能在某些方面欠佳,請您指正,共同學習進步 前端:Vuejs全家桶 后端:...
摘要:從本章開始,正式學習如何使用搭建一個博客。但通常我們都會有許多環境,如本地開發環境測試環境和線上環境等,不同的環境的配置不同,我們不可能每次部署時都要去修改引用或者。會根據環境變量的不同從當前執行進程目錄下的目錄加載不同的配置文件。 從本章開始,正式學習如何使用 Nodejs + Express + Mysql 搭建一個博客。 開發環境 首先說下開發環境安裝的核心依賴版本: Node....
摘要:路由設計路由設計以用戶注冊為例介紹如何閉環用戶注冊開發注意點使用郵箱注冊驗證郵箱是否注冊目前真實開發業務大部分都是手機號注冊,這塊由于沒有購買短信服務首先,在文件夾下新建上圖中對應真實業務邏輯現附上業務實現代碼加密國際化工具類用戶服務 路由設計 路由設計 以用戶注冊為例介紹如何閉環用戶注冊開發注意點:(1)使用郵箱注冊(2)驗證郵箱是否注冊 【目前真實開發業務大部分都是手機號注冊,這塊...
摘要:跨域跨域請求也可以使用代表允許所有此時咱們啟動服務,在接口調用時就會有跨域白名單攔截校驗 跨域corshttps://github.com/expressjs/... var config = { cors: { //跨域請求 origin: [http://localhost:5000, http://localhost:5001],//也可以使用*代表允許...
閱讀 1405·2021-10-14 09:43
閱讀 1002·2021-09-10 10:51
閱讀 1447·2021-09-01 10:42
閱讀 2197·2019-08-30 15:55
閱讀 591·2019-08-30 15:55
閱讀 2349·2019-08-30 14:21
閱讀 1722·2019-08-30 13:04
閱讀 3471·2019-08-29 13:09