摘要:機(jī)翻潤色這個(gè)模塊可以讓你在你的應(yīng)用中通過使用以下簡稱認(rèn)證請求這個(gè)文檔做了一個(gè)很好的介紹如果你使用版本同時(shí)你有一個(gè)低于版本的安裝主分支倉庫上的譯者注上的版本使用所以必須是以上如果你使用你需要從安裝這個(gè)代碼在分支上安裝用例認(rèn)證中間件
KOA-JWT (機(jī)翻潤色)
node>=7.6.0
npm v3.2.2
這個(gè)模塊可以讓你在你的KOA應(yīng)用中通過使用JSON WEB TOKEN(以下簡稱JWT)認(rèn)證HTTP請求
這個(gè)文檔做了一個(gè)很好的介紹.
如果你使用KOA版本2.+,同時(shí)你有一個(gè)低于7.6版本的node. 安裝koa-jwt@2
主分支(Koajwt git倉庫上的.譯者注)上的koa-jwt版本3+使用async/await,所以必須是node 7.6以上
如果你使用koa1,你需要從npm安裝koa-jwt@1.這個(gè)代碼在koa-v1分支上
安裝$ npm install koa-jwt
用例JWT認(rèn)證中間件的認(rèn)證通過使用JWT令牌(token,譯者注).如果令牌有效,ctx.state.user(默認(rèn)情況下)會被設(shè)置成解碼的JSON對象,以便于在稍后的中間件中進(jìn)行認(rèn)證或訪問控制.
檢索令牌令牌通常被包產(chǎn)在一個(gè)名為Authorization的HTTP頭中,但也能通過cookie來進(jìn)行,但是也可以使用Cookie來提供令牌,只要在opts.cookie選項(xiàng)上設(shè)置為包含令牌的cookie的名稱.也可以通過opts.getToken選項(xiàng)完成自定義的令牌檢索.返回的函數(shù)應(yīng)該匹配以下接口:
/** * 自定義令牌解析器 * @this 傳入中間件的CTX對象 * * @param {object} opts 中間件選項(xiàng) * @return {String|null} 返回被解析的令牌,如果沒有找到則返回null */
令牌解析順序如下所示.第一個(gè)被解析的非空令牌將被用于驗(yàn)證
運(yùn)行opts.getToken 函數(shù)
檢查cookies(如果cookies被設(shè)置了)
檢查承載令牌的認(rèn)證頭(header)
傳遞密鑰通常你在opts.secret中提供了一個(gè)多帶帶的開放密鑰,但是另一個(gè)替代方案是在一個(gè)更靠前的中間件中設(shè)置ctx.state.secret,通常是每個(gè)請求中.如果這個(gè)屬性存在,它將用來替換opts.secret中的密鑰.
檢查銷毀密鑰你可以提供一個(gè)異步的函數(shù)來讓koa-jwt檢查令牌是否被撤銷.這個(gè)函數(shù)應(yīng)該被設(shè)置再opts.isRevoked屬性中.你提供的函數(shù)應(yīng)該匹配以下接口:
/** * 你自定義的檢索撤銷解析器 * * @param {object} ctx 傳遞給中間件的CTX對象 * @param {object} token 令牌 * @param {object} user 令牌的內(nèi)容 * @return {Promise} 如果令牌沒有被銷毀, Promise必須被解析為false,其他情況下(Promise解析為true或erro)令牌被銷毀. */例子
var Koa = require("koa"); var jwt = require("koa-jwt"); var app = new Koa(); // Custom 401 handling if you don"t want to expose koa-jwt errors to users app.use(function(ctx, next){ return next().catch((err) => { if (401 == err.status) { ctx.status = 401; ctx.body = "Protected resource, use Authorization header to get access "; } else { throw err; } }); }); // Unprotected middleware app.use(function(ctx, next){ if (ctx.url.match(/^/public/)) { ctx.body = "unprotected "; } else { return next(); } }); // Middleware below this line is only reached if JWT token is valid app.use(jwt({ secret: "shared-secret" })); // Protected middleware app.use(function(ctx){ if (ctx.url.match(/^/api/)) { ctx.body = "protected "; } }); app.listen(3000);
你也可以在某些條件下有條件的運(yùn)行koa-jwt中間件:
var koa = require("koa"); var jwt = require("koa-jwt"); var app = new Koa(); // Middleware below this line is only reached if JWT token is valid // unless the URL starts with "/public" app.use(jwt({ secret: "shared-secret" }).unless({ path: [/^/public/] })); // Unprotected middleware app.use(function(ctx, next){ if (ctx.url.match(/^/public/)) { ctx.body = "unprotected "; } else { return next(); } }); // Protected middleware app.use(function(ctx){ if (ctx.url.match(/^/api/)) { ctx.body = "protected "; } }); app.listen(3000);
更多關(guān)于unless的例子,請點(diǎn)擊koa-unless
即使沒有找到認(rèn)證頭,你也可以通過添加一個(gè)passthrough選項(xiàng)來保證始終傳遞到下一個(gè)(中間件)
app.use(jwt( { secret: "shared-secret", passthrough:true }))
通過這個(gè)選項(xiàng),使得下游中間件可以基于ctx.state.user是否設(shè)置做出決定
如果你更喜歡使用另外一個(gè)ctx key來表示解碼數(shù)據(jù),只需要傳入key屬性,如下:
app.use(jwt({ secret: "shared-secret", key: "jwtdata" }));
此時(shí)解碼數(shù)據(jù)可以通過ctx.state.jwtdata得到(替換掉默認(rèn)的ctx.state.user)
你同樣可以指定audience和/或issuer
app.use(jwt({ secret: "shared-secret", audience: "http://myapi/protected", issuer: "http://issuer" }));
如果koa-jwt有設(shè)置一個(gè)expiration(exp),它將會被檢查到.
如果存在tokenkey 選項(xiàng),并且找到有效的令牌,原始令牌數(shù)據(jù)可以從隨后的中間件中的ctx.state[opts.tokenKey]屬性中得到.
這個(gè)模塊也支持令牌標(biāo)記為公鑰/私鑰對. 作為秘鑰的替代,你可以通過Buffer指定一個(gè)Public key
var publicKey = fs.readFileSync("/path/to/public.pub"); app.use(jwt({ secret: publicKey }));
當(dāng)sercret選項(xiàng)是一個(gè)函數(shù)時(shí),這個(gè)函數(shù)將會被每個(gè)koa-jwt接受到,用于決定哪個(gè)密鑰會被用于驗(yàn)證JWT
這個(gè)方法的簽名應(yīng)該是這樣的: (header) => [Promise(secret)], header表示令牌頭, 如果想作為支持JWKS的令牌頭的實(shí)例, 應(yīng)當(dāng)包含alg和kid:算法和密鑰ID字段
通過使用 node-jwks-rsa 組件,這個(gè)選項(xiàng)也可以用于支持JWKS(JSON Web Set),如下:
const { koaJwtSecret } = require("jwks-rsa"); app.use(jwt({ secret: koaJwtSecret({ jwksUri: "https://sandrino.auth0.com/.well-known/jwks.json", cache: true, cacheMaxEntries: 5, cacheMaxAge: ms("10h") }), audience: "http://myapi/protected", issuer: "http://issuer" }));關(guān)聯(lián)模塊
jsonwebtoken — JSON Web Token signing and verification
注意koa-v2版本的koa-jwt不再支持從jsonwebtoken中導(dǎo)出sign,verify和decode函數(shù)
原文地址: https://github.com/koajs/jwt
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/83458.html
摘要:到這里,基于的前后端分離實(shí)現(xiàn)方案就搞定啦四關(guān)于的一些思考實(shí)際上,在使用的過程中有一個(gè)比較致命的缺點(diǎn),就是一旦簽發(fā)了,在到期之前就會始終有效,除非服務(wù)器部署額外的邏輯。結(jié)語以上是關(guān)于基于的前后端分離實(shí)現(xiàn)方案的總結(jié)和思考。 一、jwt是什么 JWT全稱, JSON Web Token,是一個(gè)以JSON為基準(zhǔn)的標(biāo)準(zhǔn)規(guī)范。 舉例:服務(wù)器認(rèn)證以后,生成一個(gè) JSON 對象,發(fā)回給用戶,就像下...
摘要:一個(gè)本地的基于的測試服務(wù)器支持快速的啟動容器服務(wù)支持快速的發(fā)送,請求,并記錄在文件夾下,并在控制臺輸出支持一個(gè)函數(shù)完成跨域請求創(chuàng)建本地靜態(tài)服務(wù)器第一個(gè)參數(shù)為靜態(tài)文件地址,第二個(gè)參數(shù)為端口號創(chuàng)建請求請求打印在控制臺并寫入文件第 local-web-test showImg(https://segmentfault.com/img/remote/1460000016045460);一個(gè)本地...
摘要:前言本文將會從最基本的一種權(quán)限驗(yàn)證說起,即,然后是基于和的權(quán)限驗(yàn)證,最后則是和一次性密碼。由于它不依賴于,等任何外部因素,所以它是最簡單的權(quán)限驗(yàn)證方法。當(dāng)使用來進(jìn)行權(quán)限驗(yàn)證時(shí),有以下幾點(diǎn)需要注意。 前言 本文將會從最基本的一種web權(quán)限驗(yàn)證說起,即HTTP Basic authentication,然后是基于cookies和tokens的權(quán)限驗(yàn)證,最后則是signatures和一次性密...
該文章屬于《編程中的那些經(jīng)典套路——設(shè)計(jì)模式匯總》系列,并且以下內(nèi)容基于語言PHP 今天我們來談?wù)勓b飾器模式,想象一個(gè)場景: 有一篇帖子 帖子的內(nèi)容我寫好了, 三個(gè)部門的人員想控制它. 編輯組要添導(dǎo)讀文字 審核組要去敏感字 市場部想在末尾加點(diǎn)廣告 我只是一篇帖子,由你們來處置吧。 此時(shí)如何處理呢?如何寫出符合面向?qū)ο笕匦晕逶瓌t的代碼呢?由此引出裝飾器模式就發(fā)揮作用了 一言不合來看看代碼: 裝...
閱讀 2352·2021-11-23 09:51
閱讀 2002·2021-10-14 09:43
閱讀 2768·2021-09-27 13:35
閱讀 1150·2021-09-22 15:54
閱讀 2503·2021-09-13 10:36
閱讀 3800·2019-08-30 15:56
閱讀 3409·2019-08-30 14:09
閱讀 1718·2019-08-30 12:57