您好,登錄后才能下訂單哦!
本文章向大家介紹如何在laravel5.5中使用jwt-auth 生成token令牌的基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下。
Laravel 是一套簡潔、優雅的PHP Web開發框架。它可以讓你從面條一樣雜亂的代碼中解脫出來;它可以幫你構建一個完美的網絡APP,而且每行代碼都可以簡潔、富于表達力。
1:首先通過composer進行安裝
composer require tymon/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:發布配置文件:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
5:生成 secret key
: php artisan jwt:generate
安裝完成后,執行 php artisan jwt:generate,會報錯:
(1).Method Tymon\JWTAuth\Commands\JWTGenerateCommand::handle() does not exist
解決方法,這個需要修改源碼:
編輯 vendor/tymon/jwt-auth/src/Commands/JWTGenerateCommand.php,新增:
/** * Compatiblity with Laravel >= 5.5 */ public function handle() { $this->fire(); }
(2)如果未添加服務提供者,直接執行該命令,可能也會報錯!
There are no commands defined in the "jwt" namespace
解決方法:
就是上面的添加服務提供者
配置(Configuration)
secret(secret key) - 秘鑰
用來簽名 token 的秘鑰。作者將秘鑰與 Laravel 的 APP_KEY 分開,以便開發者可以獨立地修改它們。
提供了一個 artisan 命令,為我們生成一個隨機秘鑰。(php artisan jwt:generate)
ttl(token time to live) - token 生存時間
token 的有效時間,以分鐘為單位。建議盡可能設置短點,尤其是當我們也使用 token 刷新機制。
refresh_ttl(refresh time to live) - refresh 生存時間
可以刷新 token 的有效時間,以分鐘為單位。例如,如果設置為 2周,那么只能在 2周 內,刷新對應的 token,否則將會拋出 TokenExpiredException 異常。如果超過了刷新的有效時間,必須生成一個全新的 token,這意味著用戶需要重新登錄。
注:ttl 和 refresh_ttl,用于保持用戶的登錄狀態
algo(hashing algorithm) - hash 算法
用于簽名 token 的算法,保留默認值即可
user(user model path) - 用戶模型路徑
應該指向我們項目的 User 類的命名空間路徑
identifier(user identifier) - 用戶標識
從 token 的主題聲明中,根據什么標識來檢索用戶(一般是 id)
required_claims(required claims)
這些聲明必須存在于 token 的 payload 中,否則將拋出 TokenInvalidException 異常(會檢測 token 的 payload 是否存在這些聲明)
blacklist_enabled(blacklist enabled)
如果設置為 false,將無法使 token 失效。雖然我們仍然可以刷新令牌,但是之前的令牌仍舊有效,因此這樣做非常不安全。但對于非常簡單的實現,可能不需要額外的開銷(刷新 token 等),我們可以配置它。
providers
jwt-auth 包已經有一些具體實現,可用來實現各種需求。只要遵循相關接口,我們就可以覆蓋這些具體實現。
providers.user
指定基于主題聲明,來查找用戶的實現。
providers.jwt
完成 token 的編碼和解碼的繁重工作
providers.auth
通過憑證或 id 來認證用戶
providers.storage
用于驅動黑名單,并存儲 token 直到過期。
創建 tokens(Creating Tokens)
jwt-auth 包為我們提供了創建 token 的多種方法。有簡單的方法,如果你想更好的控制,也有更進一步的方法。
開箱即用(out of box),有許多必須的聲明,雖然這些都可以配置:
sub(Subject) - 包含 token 的標識符(默認是用戶 ID)
iat(Issued At) - token 發布時間(unix 時間戳)
exp(Expiry) - token 過期日期(unix 時間戳)
nbf(Not Before) - 可以使用 token 的最早時間點(unix 時間戳)
iss(Issuer) - token 發布者(默認為請求的 url)
jti(JWT Id) - token 的唯一標識符(sub 和 iat 聲明的 md5 值)
aud(Audience) - token 的目標受眾(默認不需要)
也允許自定義聲明。稍后會介紹。
創建一個基于用戶憑證的 token
創建 token 的最常用方法是,通過用戶的登錄憑證,來認證用戶。如果認證成功,則返回一個與該用戶相關的 token。例如,假設我們有一個 Laravel AuthenticateController
use JWTAuth; use Tymon\JWTAuth\Exceptions\JWTException; class AuthenticateController extends Controller { public function authenticate(Request $request) { // grab credentials from the request $credentials = $request->only('email', 'password'); try { // attempt to verify the credentials and create a token for the user if (! $token = JWTAuth::attempt($credentials)) { return response()->json(['error' => 'invalid_credentials'], 401); } } catch (JWTException $e) { // something went wrong whilst attempting to encode the token return response()->json(['error' => 'could_not_create_token'], 500); } // all good so return the token return response()->json(compact('token')); } }
創建一個基于用戶對象的 token
我們可以跳過用戶認證,只傳遞一個用戶對象
$user = User::first(); $token = JWTAuth::fromUser($user);
上面的 2 個方法也有第二個參數,可以傳遞一個 '自定義聲明' 的數組
在解碼 token 時,這些自定義聲明,將和其他聲明一起提供。
注意:添加大量的自定義聲明,將增加 token 的大小
創建一個基于任意你喜歡的內容的 token
作者給我們提供了對底層類和方法的訪問,來提供高級的、可自定義的功能。
示例使用了內建的 'Tymon\JWTAuth\PayloadFactory' 實例(或者使用 JWTFactory 門面):
$customClaims = ['foo' => 'bar', 'baz' => 'bob']; $payload = JWTFactory::make($customClaims); $token = JWTAuth::encode($payload);
也可以在 'Tymon\JWTAuth\PayloadFactory' 實例上鏈式調用聲明(或者使用 JWTFactory 門面):
$payload = JWTFactory::sub(123)->aud('foo')->foo(['bar' => 'baz']); $token = JWTAuth::encode($payload);
認證(Authentication)
一旦用戶使用他們的憑證登錄,下一步將使用 token 發起一個后續請求,來檢索用戶詳情,以便我們可以將其顯示為已登錄。
使用內置方法,通過 http 發起認證請求,我們需要設置一個 Authorization 請求頭,如下所示:
Authorization: Bearer {yourtokenhere}
Apache 用戶需要注意:
Apache 好像會丟棄 Authorization 請求頭,如果該請求頭不是 base64 編碼的 user/pass 組合。為了解決此問題,我們可以在 apache 配置文件中添加一下內容:
RewriteEngine On RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
或者,我們可以通過在查詢字符串中包含 token 來實現:
http://api.mysite.com/me?token={yourtokenhere}
為了從請求中獲取 token,我們可以:
// 會設置 token 到返回的對象中 JWTAuth::parseToken(); // 接著,我們可以繼續鏈式調用方法 $user = JWTAuth::parseToken()->authenticate();
為了獲取 token 的值,我們可以調用:
$token = JWTAuth::getToken();
如果設置了一個 token,則會返回 token,否則(為方便起見),它將使用上述方法,嘗試從請求中解析 token,如果沒有設置 token 或 沒有 token 可以被解析,最終返回 false。
當然,如果在我們的程序中有其他入口點,我們也可以根據需要手動設置 token。例如:
JWTAuth::setToken('foo.bar.baz');
從 token 中檢索認證過的用戶
public function getAuthenticatedUser() { try { if(! $user = JWTAuth::parseToken()->authenticate()){ return response()->json('user_not_found', 404); } } catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) { return response()->json(['token_expired'], $e->getStatusCode()); } catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) { return response()->json(['token_invalid'], $e->getStatusCode()); } catch (Tymon\JWTAuth\Exceptions\JWTException $e) { return response()->json(['token_absent'], $e->getStatusCode()); } return response()->json(compact('user')); }
如果不喜歡內聯捕獲多個異常的方法,我們可以隨意使用 Laravel 添加全局異常處理程序。
在 app/Exceptions/Handler.php 中,將下面代碼添加到 render() 方法:
public function render($request, Exception $e) { if ($e instanceof Tymon\JWTAuth\Exceptions\TokenExpiredException) { return response()->json(['token_expired'], $e->getStatusCode()); } else if ($e instanceof Tymon\JWTAuth\Exceptions\TokenInvalidException) { return response()->json(['token_invalid'], $e->getStatusCode()); } return parent::render($request, $e); }
中間件和過濾器
如果我們使用的是 Laravel 5,可以使用內置的 2 個中間件:
GetUserFromToken
檢查請求頭和查詢字符串(正如上面解釋過的)是否存在 token,并嘗試解碼 token。如上所述,同樣的事件被觸發。
RefreshToken
此中間件將再次嘗試從請求中解析 token,然后將刷新 token(從而使舊 token 失效),并將其作為下一次響應的一部分返回。這實際上產生了單個使用 token 流,如果 token 被泄露,這種方式會減少攻擊,因為它僅對單個請求有效。
為了使用這 2 個中間件,我們需要將它們注冊到 app/Http/Kernel.php 里的 $routeMIddleware 屬性:
protected $routeMiddleware = [ ... 'jwt.auth' => 'Tymon\JWTAuth\Middleware\GetUserFromToken', 'jwt.refresh' => 'Tymon\JWTAuth\Middleware\RefreshToken', ];
以上就是小編為大家帶來的如何在laravel5.5中使用jwt-auth 生成token令牌的全部內容了,希望大家多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。