1:首先通過composer進行安裝
composerrequiretymon/jwt-auth
2:添加服務提供者
編輯config/app.php,在"providers"添加:
'Tymon\\JWTAuth\\Providers\\JWTAuthServiceProvider',
3:添加Facades
編輯config/app.php,在"alias"添加:
'JWTAuth'=>'Tymon\\JWTAuth\\Facades\\JWTAuth',
'JWTFactory'=>'Tymon\\JWTAuth\\Facades\\JWTFactory',
4:發佈配置文件:
phpartisanvendor:publish--provider="Tymon\\JWTAuth\\Providers\\JWTAuthServiceProvider"
5:生成secretkey
:phpartisanjwt:generate
安裝完成後,執行phpartisanjwt:generate,會報錯:
(1).MethodTymon\\JWTAuth\\Commands\\JWTGenerateCommand::handle()doesnotexist
解決方法,這個需要修改源碼:
編輯vendor/tymon/jwt-auth/src/Commands/JWTGenerateCommand.php,新增:
(2)如果未添加服務提供者,直接執行該命令,可能也會報錯!
Therearenocommandsdefinedinthe"jwt"namespace
解決方法:
就是上面的添加服務提供者
配置(Configuration)
secret(secretkey)-秘鑰
用來簽名token的秘鑰。作者將秘鑰與Laravel的APP_KEY分開,以便開發者可以獨立地修改它們。
提供了一個artisan命令,為我們生成一個隨機秘鑰。(phpartisanjwt:generate)
ttl(tokentimetolive)-token生存時間
token的有效時間,以分鐘為單位。建議儘可能設置短點,尤其是當我們也使用token刷新機制。
refresh_ttl(refreshtimetolive)-refresh生存時間
可以刷新token的有效時間,以分鐘為單位。例如,如果設置為2周,那麼只能在2周內,刷新對應的token,否則將會拋出TokenExpiredException異常。如果超過了刷新的有效時間,必須生成一個全新的token,這意味著用戶需要重新登錄。
注:ttl和refresh_ttl,用於保持用戶的登錄狀態
algo(hashingalgorithm)-hash算法
用於簽名token的算法,保留默認值即可
user(usermodelpath)-用戶模型路徑
應該指向我們項目的User類的命名空間路徑
identifier(useridentifier)-用戶標識
從token的主題聲明中,根據什麼標識來檢索用戶(一般是id)
required_claims(requiredclaims)
這些聲明必須存在於token的payload中,否則將拋出TokenInvalidException異常(會檢測token的payload是否存在這些聲明)
blacklist_enabled(blacklistenabled)
如果設置為false,將無法使token失效。雖然我們仍然可以刷新令牌,但是之前的令牌仍舊有效,因此這樣做非常不安全。但對於非常簡單的實現,可能不需要額外的開銷(刷新token等),我們可以配置它。
providers
jwt-auth包已經有一些具體實現,可用來實現各種需求。只要遵循相關接口,我們就可以覆蓋這些具體實現。
providers.user
指定基於主題聲明,來查找用戶的實現。
providers.jwt
完成token的編碼和解碼的繁重工作
providers.auth
通過憑證或id來認證用戶
providers.storage
用於驅動黑名單,並存儲token直到過期。
創建tokens(CreatingTokens)
jwt-auth包為我們提供了創建token的多種方法。有簡單的方法,如果你想更好的控制,也有更進一步的方法。
開箱即用(outofbox),有許多必須的聲明,雖然這些都可以配置:
sub(Subject)-包含token的標識符(默認是用戶ID)
iat(IssuedAt)-token發佈時間(unix時間戳)
exp(Expiry)-token過期日期(unix時間戳)
nbf(NotBefore)-可以使用token的最早時間點(unix時間戳)
iss(Issuer)-token發佈者(默認為請求的url)
jti(JWTId)-token的唯一標識符(sub和iat聲明的md5值)
aud(Audience)-token的目標受眾(默認不需要)
創建一個基於用戶憑證的token
創建token的最常用方法是,通過用戶的登錄憑證,來認證用戶。如果認證成功,則返回一個與該用戶相關的token。例如,假設我們有一個LaravelAuthenticateController
創建一個基於用戶對象的token
我們可以跳過用戶認證,只傳遞一個用戶對象
上面的2個方法也有第二個參數,可以傳遞一個'自定義聲明'的數組
在解碼token時,這些自定義聲明,將和其他聲明一起提供。
注意:添加大量的自定義聲明,將增加token的大小
創建一個基於任意你喜歡的內容的token
作者給我們提供了對底層類和方法的訪問,來提供高級的、可自定義的功能。
示例使用了內建的'Tymon\\JWTAuth\\PayloadFactory'實例(或者使用JWTFactory門面):
也可以在'Tymon\\JWTAuth\\PayloadFactory'實例上鍊式調用聲明(或者使用JWTFactory門面):
認證(Authentication)
一旦用戶使用他們的憑證登錄,下一步將使用token發起一個後續請求,來檢索用戶詳情,以便我們可以將其顯示為已登錄。
使用內置方法,通過http發起認證請求,我們需要設置一個Authorization請求頭,如下所示:
Apache用戶需要注意:
Apache好像會丟棄Authorization請求頭,如果該請求頭不是base64編碼的user/pass組合。為了解決此問題,我們可以在apache配置文件中添加一下內容:
或者,我們可以通過在查詢字符串中包含token來實現:
為了從請求中獲取token,我們可以:
為了獲取token的值,我們可以調用:
如果設置了一個token,則會返回token,否則(為方便起見),它將使用上述方法,嘗試從請求中解析token,如果沒有設置token或沒有token可以被解析,最終返回false。
當然,如果在我們的程序中有其他入口點,我們也可以根據需要手動設置token。例如:
從token中檢索認證過的用戶
如果不喜歡內聯捕獲多個異常的方法,我們可以隨意使用Laravel添加全局異常處理程序。
在app/Exceptions/Handler.php中,將下面代碼添加到render()方法:
中間件和過濾器
如果我們使用的是Laravel5,可以使用內置的2箇中間件:
GetUserFromToken
檢查請求頭和查詢字符串(正如上面解釋過的)是否存在token,並嘗試解碼token。如上所述,同樣的事件被觸發。
RefreshToken
此中間件將再次嘗試從請求中解析token,然後將刷新token(從而使舊token失效),並將其作為下一次響應的一部分返回。這實際上產生了單個使用token流,如果token被洩露,這種方式會減少攻擊,因為它僅對單個請求有效。
為了使用這2箇中間件,我們需要將它們註冊到app/Http/Kernel.php裡的$routeMIddleware屬性:
以上這篇laravel5.5安裝jwt-auth生成token令牌的示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持小編。
閱讀更多 科技i關注 的文章