koa-jwt 全面解析,安檢利器!

學習 Koa 不易,今天學習到了 koa-jwt 這個登錄驗證必不可少的中間件。本文會說明jwt是什麼、token怎麼來的、如何驗證token。
一反常態,先上代碼!(本代碼由 koa-generater 生成,安裝 koa-jwt, jsonwebtoken 兩個 npm 包 )web

文件名及源代碼:

文件名: app.js
1.png
紅色框:jwt 相關的代碼
藍色框:爲了完成demo,在原有腳手架中作的調整。

文件名: routes/index.js
2.png
這裏簡單的模仿一個 login 請求,返回一個 token。

算法

文件名: routes/users.js
3.png
/users 如下的路由需經過 jwt 驗證才能訪問npm


文件名: auth.js
4.png

json

思路及說明

1.咱們在瀏覽器輸入 localhost:3000/login 獲取 token。一下大串都是token,分爲3部分,用 '.' 分隔;
5.png
2.這裏用 postman 去訪問 localhost:3000/users/info 模擬訪問用戶數據。要在 header中加入 authorization, 注意:authorization的值的格式;
6.png
3.當輸入 users 路由的時候 koa-jwt 不去驗證 token 的正確性,僅僅去驗證header中是否有 authorization 而且值爲 'Bearer token',而後再根據配置中 isRevoked 的函數去進行驗證。 isRevoked 返回 true 代表 token 不正確,false 表示 token 正確。
4.在驗證中,使用 jsonwebtoken.verify 去驗證 token 是否正確,並返回。

API 解析:

Koa-jwt:這個函數仍是截圖看得清楚
7.1.png
1. secret: 能夠理解爲一個加密因子,在生成 token 的時候用這個因子,驗證 token 的時候也用同一個。Serect 能夠是數組,當secret是一個數組時,在驗證 token 時任何一個 因子經過驗證,token就合法有效。
2. passthrough: 當爲true時,即便在 header 中沒有 authorization 也會經過這個 中間件(僅僅經過中間件的驗證,沒有經過 jsonwebtoken.verify)
3. isRevoked:須要一個函數來驗證token的對錯。這個函數有3個參數:ctx, decodedToken, token。其中 token 能夠直接被驗證: jsonwebtoken.verify(token)

Jsonwebtoken: 這個纔是主角!數組

jsonwebtoken.sign(payload, secretOrPrivateKey, [options, callback]) 生成 token複製代碼

1.payload 是須要被加密的數據(個人理解 jwt其實就是加密解密和驗證的過程)。在payload裏有三個key很特別:iat(issued at)、exp(expiresIn)、nbf(notBefore),這幾個參數推薦寫在 options 中,不建議寫在 payload 裏;
2.secretOrPrivateKey 能夠是字符串,也能夠是對成加密的 key,或者非對稱加密的私有key;
3.options 這裏能夠選擇的參數就好多了,algorithms:加密算法,默認是HS256,expriesIn: token有效持續時間,notBefore: token在何時失效,更多參數請參考官網;
4.返回一個token。瀏覽器


jwt.verify(token, secretOrPublicKey, [options, callback]) 對token的驗證複製代碼

1.token : 固然是用 sign 函數生成的token啦;
2.secretOrPublicKey:與生成 token 的加密因子相互對應,要麼是相同的字符串和對稱加密的key,或者是非對稱加密的公有key;
3.options: 與 sign 相互照應且要一致。audience,issuer,jwtid等。
4.正確的時候返回 payload,錯誤的時候throw 一個 err,裏面包含了錯誤的message,根據message判斷錯誤類型。
9.png
文檔這裏有個坑:
expiredIn: 默認單位是 秒!!! 如下是鐵證啊( jsonwebtoken/verify.js ,這裏是用秒作的對比,千萬別覺得是毫秒
8.png

bash

Tips: 一般狀況下,咱們也會在cookie裏寫一份token,這樣每一個請求均可以經過token驗證,此時能夠忽略 header中的 autherization(passthrough: truecookie

相關文章
相關標籤/搜索