摘要:什么是官方給出的定義是是一個開放標準,它定義了一種緊湊的獨立的方式,用于安全地在當事人之間傳遞信息作為一個對象。結構由下面三個部分組成一個字符串通常由兩個部分組成令牌的,即,以及正在使用的散列算法,如或。
什么是JSON Web Token ?
官方給出的定義是:
JSON Web Token(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊的、獨立的方式,用于安全地在當事人之間傳遞信息作為一個JSON對象。這些信息可以被驗證和信任,因為它是數字簽名的。JWTs可以使用一個secret (使用HMAC算法)或使用RSA的公鑰/私鑰對來簽名。 文中我們使用公私鑰的加密方式。
由下面三個部分組成一個token字符串
Header
header通常由兩個部分組成:令牌的type,即JWT,以及正在使用的散列算法,如HMAC SHA256或RSA。
Payload ,包含三個類型,自定義部分可以存儲一些信息,如:用戶信息、角色等;
Registered claims:已注冊的,具體屬性,點擊傳送
Public claims:自定義的,具體屬性,點擊傳送
Private claims:這是在同意使用它們的各方之間共享信息的自定義聲明,并且既沒有注冊也沒有公開聲明。
Signature
使用header、payload和secret生成一個簽名
工作流程這里直接使用官網的圖
使用json傳輸數據,因此在編碼時,也會更小
更安全
無需在服務端保存相關信息,只需要驗證token是否有效即可
代碼實現這里使用express來創建一個服務
創建一個入口文件,主要用于一些中間件的掛載
//index.js const express = require("express") const app = express() // 使用body-parser獲取請求body const bodyParser = require("body-parser"); const cookieParser = require("cookie-parser") // 引入路由中間件 const routerAdmin = require("./app/router-admin") app.use(bodyParser.json()); // for parsing application/json app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded app.use(cookieParser()) // 加載路由模塊 app.use("/admin",routerAdmin); app.listen(3000,function(){ console.log("port 3000 start") })
然后創建一個 app/router-admin.js 生成需要用到認證的路由中間件,這里我是在mongodb中取的用戶信息,也可以自行模擬數據
//router-admin.js const express = require("express") const router = express.Router() var MongoClient = require("mongodb").MongoClient; const jwt = require("jsonwebtoken") const fs = require("fs") // const secretStr = "sdfsjfklsjfiewjwoieow" // 根據mongodb生成的_id查詢數據 var ObjectId = require("mongodb").ObjectId var url = "mongodb://localhost:27017/"; var payload = { user : "william", admin : true } router.post("/login",function(req,res){ let name = req.body.name, pwd = req.body.pwd; var cert = fs.readFileSync("./private.key") MongoClient.connect(url, function(err, db) { if (err) throw err; var dbo = db.db("blog"); var noSqlStr = {name:name,pwd:pwd} dbo.collection("userlist"). find(noSqlStr).toArray(function(err, result) { // 返回集合中所有數據 if (err) throw err; // console.log(result); // 驗證通過,服務端回傳token if(!!result.length){ var token = jwt.sign(payload, cert, { algorithm: "RS256" ,expiresIn:"30s"}); res.send({ status : true, msg : "", token : token }) } db.close(); }); }); }) // 驗證jsonwebtoken是否過期的中間件,在login接口后面執行,除了login接口的請求外,其他接口都需要驗證token router.use(function jwtVerify(req, res, next) { let token = req.get("token") console.log(token) var cert = fs.readFileSync("./public.key"); // 先解密 jwt.verify(token, cert,function(err,decoded){ if(err || !decoded) res.send({data:null,status:false,msg:err}) if(decoded.user == payload.user){ next(); } }); }); router.get("/search",function(req,res){ res.send({data:"查詢成功",msg:"",status:true}) }) module.exports = router
因為這里使用的是公私鑰的加密方式,需使用ssh-keygen生成公私鑰
私鑰生成:ssh-keygen -t rsa -b 2048 -f private.key 公鑰生成:openssl rsa -in private.key -pubout -outform PEM -out public.key完整項目地址 參考
https://jwt.io/introduction/
https://tools.ietf.org/html/r...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95364.html
摘要:權限控制業務需求查看用戶列表接口管理員才能使用更新用戶信息接口當前對應用戶才能調用這時候需要需要加入中間件來實現權限控制這時候咱們需要學習了解下課前學習了解入門教程基于的認證版實現本文中使用了插件現將服務邏輯代碼附上服務配置設置創 權限控制 業務需求:查看用戶列表接口(管理員才能使用)、更新用戶信息接口(當前對應用戶才能調用) 這時候需要需要加入中間件來實現權限控制: showImg(...
摘要:用于方便地搭建能夠處理超高并發擴展性極高的動態應用服務和動態網關。 介紹 權限認證是接口開發中不可避免的問題,權限認證包括兩個方面 接口需要知道調用的用戶是誰 接口需要知道該用戶是否有權限調用 第1個問題偏向于架構,第2個問題更偏向于業務,因此考慮在架構層解決第1個問題,以達到以下目的 所有請求被保護的接口保證是合法的(已經認證過的用戶) 接口可以從請求頭中獲取當前用戶信息 每個...
摘要:一步一步構建一個應用開篇地址基于的認證流程客戶端用戶發登錄請求服務端驗證用戶名密碼驗證成功服務端生成一個,響應給客戶端客戶端之后的每次請求中都帶上這個服務端對需要認證的接口要驗證,驗證成功接收請求這里我們采用來生成,使用驗證驗證成功會把 [一步一步構建一個react應用-開篇](https://segmentfault.com/a/11... git地址 基于token的認證流程 客...
摘要:一步一步構建一個應用開篇地址基于的認證流程客戶端用戶發登錄請求服務端驗證用戶名密碼驗證成功服務端生成一個,響應給客戶端客戶端之后的每次請求中都帶上這個服務端對需要認證的接口要驗證,驗證成功接收請求這里我們采用來生成,使用驗證驗證成功會把 [一步一步構建一個react應用-開篇](https://segmentfault.com/a/11... git地址 基于token的認證流程 客...
閱讀 3045·2021-10-12 10:12
閱讀 5349·2021-09-26 10:20
閱讀 1515·2021-07-26 23:38
閱讀 2807·2019-08-30 15:54
閱讀 1636·2019-08-30 13:45
閱讀 1953·2019-08-30 11:23
閱讀 3078·2019-08-29 13:49
閱讀 819·2019-08-26 18:23