從零實現Lumen-JWT擴展包(序):前因
轉自:https://zhuanlan.zhihu.com/p/22531819?refer=lsxiao
最近這段時間我尋思著把幾個月前爬下來的6萬多首詩詞曲文做成一個API,免費開放給大家用。
這麽做的原因有三:
- 其一,是因為之前寫過的古詩詞文網由於有很多BUG,而且又在備案http://gushiciwen.com的域名,索性直接把網站下線,域名轉回國內後,這段時間又忙,沒時間弄阿裏雲的主機,閑置了快個多月了。
- 其二,是想給古詩詞文網寫一個Android版的開源示例的app,網站有了,但是我沒有現成的REST API。
- 其三,是因為最近 taylorotwell 發布了Lumen5.3,從使用Laravel以來,還沒試過Lumen,所以先順便嘗試下Lumen。
說寫就寫吧,前幾天就開工了,用了的Dingo/api和tymondesigns/jwt-auth來做,不過過程中發現很多坑,而且這些坑大部分都需要自己去填,這樣寫下來,真的是很不爽。
我真的不是想貶低tymondesigns/jwt-auth,這是一個很好的擴展包,提高了效率。但是,真的很不好用,我不知道作者是不是真的用過這個庫實現過一些API的Demo,我就隨便舉個栗子,比如說客戶端請求並發的問題。
說這個問題前,先普及一些概念。
由於JWT推薦Token過期時效盡量不要太長,比如1至2小時都是可以的,那麽為了盡量減輕客戶端主動請求刷新Token的操作,可以在每次客戶端發起需要驗證Token的請求時,對舊Token進行刷新,新Token會以 Authorization: Bearer <token> 頭的形式添加到HTTP響應頭中,因為開啟了黑名單,舊的Token會在刷新完成後,被加入黑名單,也就不能再次使用了。
當客戶端請求並發的時候,問題就來了,請求的處理完成速度肯定會有先後,當前一個請求處理完成後,Token已經刷新了,後一個請求拿著一個已經被加入黑名單的Token問服務器要數據,此時請求只會被拒絕。
如下所示,並發請求:
用第三方包圖的就是方便,結果還要去翻Issues,看看別人是怎麽用的,著實惱火。
不過最新的1.0dev版本增加了JWT_BLACKLIST_GRACE_PERIOD配置,設置一個黑名單寬限時間,允許在遇到並發請求的時候,避免上述的情況,不過這個方案我認為不能根本上的解決並發的問題,而且我個人已經不想在花時間給未來可能帶來的問題上了。
所以,你們也就知道我要幹什麽了,別人的輪子不好用,不順手,只有自己擼輪子了。
這篇教程我會分為三個部分來寫:
- 準備步驟,包括從如何設置命名空間,到創建ServiceProvider,以及如何讓Lumen讀取擴展包配置文件,簡單測試是否能夠讀取配置等。
- 實現JWT,包括生成Token,校驗Token,刷新Token,黑名單等,不過這部分我會根據自己的喜好進行設計。
- 為Lumen集成JWT用戶認證功能。
- 發布擴展包到Packagist,讓別人能夠通過Composer輕松的把我們的擴展包集成到自己的項目中去。
第一部分的代碼在我寫這篇序的時候已經完成了。
最後每個部分的代碼我都會以Tutorial-1、Tutorial-2、Tutorial-3、Tutorial-4、Tutorial-5分支的形式上傳到Github中。
master分支會存放完成後的擴展包代碼。
- 從零實現Lumen-JWT擴展包(序):前因
- 從零實現Lumen-JWT擴展包(一):基礎構建
- 從零實現Lumen-JWT擴展包(二):JWT生成
- 從零實現Lumen-JWT擴展包(三):JWT解析
- 從零實現Lumen-JWT擴展包(四):用戶認證
- 從零實現Lumen-JWT擴展包(五):發布擴展包
----------------------------------------------------------------
2016年9月23日 01:41:22
由於JWT實現篇幅太長,JWT實現拆分成:
- 從零實現Lumen-JWT擴展包(二):JWT生成
- 從零實現Lumen-JWT擴展包(三):JWT解析
----------------------------------------------------------------
2016年9月30日 08:28:22
這個系列已經完結了,不過我會增加一個編寫artisan 來實現命令行生成秘鑰的章節。
Github lsxiao/jwt-auth,點擊前往。
從零實現Lumen-JWT擴展包(序):前因