學習 Koa 不易,今天學習到了 koa-jwt
這個登錄驗證必不可少的中間件。本文會說明jwt是什麼、token怎麼來的、如何驗證token。
一反常態,先上代碼!(本代碼由 koa-generater
生成,安裝 koa-jwt, jsonwebtoken
兩個 npm 包 )web
文件名: routes/index.js
這裏簡單的模仿一個 login 請求,返回一個 token。
算法
文件名: routes/users.js/users
如下的路由需經過 jwt 驗證才能訪問npm
文件名: auth.js
json
localhost:3000/login
獲取 token。一下大串都是token,分爲3部分,用 '.' 分隔;
authorization
而且值爲
'Bearer token'
,而後再根據配置中 isRevoked 的函數去進行驗證。
isRevoked 返回 true 代表 token 不正確,false 表示 token 正確。
jsonwebtoken.verify
去驗證 token 是否正確,並返回。
secret
: 能夠理解爲一個加密因子,在生成 token 的時候用這個因子,驗證 token 的時候也用同一個。Serect 能夠是數組,當secret是一個數組時,在驗證 token 時任何一個 因子經過驗證,token就合法有效。
passthrough
: 當爲true時,即便在 header 中沒有 authorization 也會經過這個 中間件(僅僅經過中間件的驗證,沒有經過 jsonwebtoken.verify)
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判斷錯誤類型。
文檔這裏有個坑:expiredIn
: 默認單位是 秒!!! 如下是鐵證啊( jsonwebtoken/verify.js
,這裏是用秒作的對比,千萬別覺得是毫秒
bash
Tips: 一般狀況下,咱們也會在cookie裏寫一份token,這樣每一個請求均可以經過token驗證,此時能夠忽略 header中的 autherization(passthrough: true)cookie