主頁(yè) > 知識(shí)庫(kù) > laravel5.5安裝jwt-auth 生成token令牌的示例

laravel5.5安裝jwt-auth 生成token令牌的示例

熱門標(biāo)簽:江門回?fù)芡夂粝到y(tǒng) 天潤(rùn)融通外呼系統(tǒng)好嗎 杭州語(yǔ)音電銷機(jī)器人 泊頭在哪里辦理400電話 欣思維地圖標(biāo)注 高德地圖標(biāo)注位置怎么標(biāo)注 電銷機(jī)器人沒(méi)有效果怎么樣 高德地圖標(biāo)注店鋪收費(fèi)嗎 江西電銷機(jī)器人收費(fèi)

1:首先通過(guò)composer進(jìn)行安裝

composer require tymon/jwt-auth

2:添加服務(wù)提供者

編輯 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:發(fā)布配置文件:

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"

5:生成 secret key

: php artisan jwt:generate

安裝完成后,執(zhí)行 php artisan jwt:generate,會(huì)報(bào)錯(cuò):

(1).Method Tymon\JWTAuth\Commands\JWTGenerateCommand::handle() does not exist

解決方法,這個(gè)需要修改源碼:

編輯 vendor/tymon/jwt-auth/src/Commands/JWTGenerateCommand.php,新增:

 /**
 * Compatiblity with Laravel >= 5.5
*/
 public function handle()
 {
  $this->fire();
 }

(2)如果未添加服務(wù)提供者,直接執(zhí)行該命令,可能也會(huì)報(bào)錯(cuò)!

There are no commands defined in the "jwt" namespace

解決方法:

就是上面的添加服務(wù)提供者

配置(Configuration)

secret(secret key) - 秘鑰

用來(lái)簽名 token 的秘鑰。作者將秘鑰與 Laravel 的 APP_KEY 分開,以便開發(fā)者可以獨(dú)立地修改它們。

提供了一個(gè) artisan 命令,為我們生成一個(gè)隨機(jī)秘鑰。(php artisan jwt:generate)

ttl(token time to live) - token 生存時(shí)間

token 的有效時(shí)間,以分鐘為單位。建議盡可能設(shè)置短點(diǎn),尤其是當(dāng)我們也使用 token 刷新機(jī)制。

refresh_ttl(refresh time to live) - refresh 生存時(shí)間

可以刷新 token 的有效時(shí)間,以分鐘為單位。例如,如果設(shè)置為 2周,那么只能在 2周 內(nèi),刷新對(duì)應(yīng)的 token,否則將會(huì)拋出 TokenExpiredException 異常。如果超過(guò)了刷新的有效時(shí)間,必須生成一個(gè)全新的 token,這意味著用戶需要重新登錄。

注:ttl 和 refresh_ttl,用于保持用戶的登錄狀態(tài)

algo(hashing algorithm) - hash 算法

用于簽名 token 的算法,保留默認(rèn)值即可

user(user model path) - 用戶模型路徑

應(yīng)該指向我們項(xiàng)目的 User 類的命名空間路徑

identifier(user identifier) - 用戶標(biāo)識(shí)

從 token 的主題聲明中,根據(jù)什么標(biāo)識(shí)來(lái)檢索用戶(一般是 id)

required_claims(required claims)

這些聲明必須存在于 token 的 payload 中,否則將拋出 TokenInvalidException 異常(會(huì)檢測(cè) token 的 payload 是否存在這些聲明)

blacklist_enabled(blacklist enabled)

如果設(shè)置為 false,將無(wú)法使 token 失效。雖然我們?nèi)匀豢梢运⑿铝钆疲侵暗牧钆迫耘f有效,因此這樣做非常不安全。但對(duì)于非常簡(jiǎn)單的實(shí)現(xiàn),可能不需要額外的開銷(刷新 token 等),我們可以配置它。

providers

jwt-auth 包已經(jīng)有一些具體實(shí)現(xiàn),可用來(lái)實(shí)現(xiàn)各種需求。只要遵循相關(guān)接口,我們就可以覆蓋這些具體實(shí)現(xiàn)。

providers.user

指定基于主題聲明,來(lái)查找用戶的實(shí)現(xiàn)。

providers.jwt

完成 token 的編碼和解碼的繁重工作

providers.auth

通過(guò)憑證或 id 來(lái)認(rèn)證用戶

providers.storage

用于驅(qū)動(dòng)黑名單,并存儲(chǔ) token 直到過(guò)期。

創(chuàng)建 tokens(Creating Tokens)

jwt-auth 包為我們提供了創(chuàng)建 token 的多種方法。有簡(jiǎn)單的方法,如果你想更好的控制,也有更進(jìn)一步的方法。

開箱即用(out of box),有許多必須的聲明,雖然這些都可以配置:

sub(Subject) - 包含 token 的標(biāo)識(shí)符(默認(rèn)是用戶 ID)

iat(Issued At) - token 發(fā)布時(shí)間(unix 時(shí)間戳)

exp(Expiry) - token 過(guò)期日期(unix 時(shí)間戳)

nbf(Not Before) - 可以使用 token 的最早時(shí)間點(diǎn)(unix 時(shí)間戳)

iss(Issuer) - token 發(fā)布者(默認(rèn)為請(qǐng)求的 url)

jti(JWT Id) - token 的唯一標(biāo)識(shí)符(sub 和 iat 聲明的 md5 值)

aud(Audience) - token 的目標(biāo)受眾(默認(rèn)不需要)

也允許自定義聲明。稍后會(huì)介紹。

創(chuàng)建一個(gè)基于用戶憑證的 token

創(chuàng)建 token 的最常用方法是,通過(guò)用戶的登錄憑證,來(lái)認(rèn)證用戶。如果認(rèn)證成功,則返回一個(gè)與該用戶相關(guān)的 token。例如,假設(shè)我們有一個(gè) 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'));
 }
}

創(chuàng)建一個(gè)基于用戶對(duì)象的 token

我們可以跳過(guò)用戶認(rèn)證,只傳遞一個(gè)用戶對(duì)象

$user = User::first();
$token = JWTAuth::fromUser($user);

上面的 2 個(gè)方法也有第二個(gè)參數(shù),可以傳遞一個(gè) '自定義聲明' 的數(shù)組

在解碼 token 時(shí),這些自定義聲明,將和其他聲明一起提供。

注意:添加大量的自定義聲明,將增加 token 的大小

創(chuàng)建一個(gè)基于任意你喜歡的內(nèi)容的 token

作者給我們提供了對(duì)底層類和方法的訪問(wèn),來(lái)提供高級(jí)的、可自定義的功能。

示例使用了內(nèi)建的 'Tymon\JWTAuth\PayloadFactory' 實(shí)例(或者使用 JWTFactory 門面):

$customClaims = ['foo' => 'bar', 'baz' => 'bob'];
$payload = JWTFactory::make($customClaims);
$token = JWTAuth::encode($payload);

也可以在 'Tymon\JWTAuth\PayloadFactory' 實(shí)例上鏈?zhǔn)秸{(diào)用聲明(或者使用 JWTFactory 門面):

$payload = JWTFactory::sub(123)->aud('foo')->foo(['bar' => 'baz']);
$token = JWTAuth::encode($payload);

認(rèn)證(Authentication)

一旦用戶使用他們的憑證登錄,下一步將使用 token 發(fā)起一個(gè)后續(xù)請(qǐng)求,來(lái)檢索用戶詳情,以便我們可以將其顯示為已登錄。

使用內(nèi)置方法,通過(guò) http 發(fā)起認(rèn)證請(qǐng)求,我們需要設(shè)置一個(gè) Authorization 請(qǐng)求頭,如下所示:

Authorization: Bearer {yourtokenhere}

Apache 用戶需要注意:

Apache 好像會(huì)丟棄 Authorization 請(qǐng)求頭,如果該請(qǐng)求頭不是 base64 編碼的 user/pass 組合。為了解決此問(wèn)題,我們可以在 apache 配置文件中添加一下內(nèi)容:

 RewriteEngine On
  RewriteCond %{HTTP:Authorization} ^(.*)
  RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

或者,我們可以通過(guò)在查詢字符串中包含 token 來(lái)實(shí)現(xiàn):

http://api.mysite.com/me?token={yourtokenhere}

為了從請(qǐng)求中獲取 token,我們可以:

// 會(huì)設(shè)置 token 到返回的對(duì)象中
JWTAuth::parseToken();
// 接著,我們可以繼續(xù)鏈?zhǔn)秸{(diào)用方法
$user = JWTAuth::parseToken()->authenticate();

為了獲取 token 的值,我們可以調(diào)用:

$token = JWTAuth::getToken();

如果設(shè)置了一個(gè) token,則會(huì)返回 token,否則(為方便起見),它將使用上述方法,嘗試從請(qǐng)求中解析 token,如果沒(méi)有設(shè)置 token 或 沒(méi)有 token 可以被解析,最終返回 false。

當(dāng)然,如果在我們的程序中有其他入口點(diǎn),我們也可以根據(jù)需要手動(dòng)設(shè)置 token。例如:

JWTAuth::setToken('foo.bar.baz');

從 token 中檢索認(rèn)證過(guò)的用戶

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'));
  }

如果不喜歡內(nèi)聯(lián)捕獲多個(gè)異常的方法,我們可以隨意使用 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);
  }

中間件和過(guò)濾器

如果我們使用的是 Laravel 5,可以使用內(nèi)置的 2 個(gè)中間件:

GetUserFromToken

檢查請(qǐng)求頭和查詢字符串(正如上面解釋過(guò)的)是否存在 token,并嘗試解碼 token。如上所述,同樣的事件被觸發(fā)。

RefreshToken

此中間件將再次嘗試從請(qǐng)求中解析 token,然后將刷新 token(從而使舊 token 失效),并將其作為下一次響應(yīng)的一部分返回。這實(shí)際上產(chǎn)生了單個(gè)使用 token 流,如果 token 被泄露,這種方式會(huì)減少攻擊,因?yàn)樗鼉H對(duì)單個(gè)請(qǐng)求有效。

為了使用這 2 個(gè)中間件,我們需要將它們注冊(cè)到 app/Http/Kernel.php 里的 $routeMIddleware 屬性:

 protected $routeMiddleware = [
    ...
    'jwt.auth' => 'Tymon\JWTAuth\Middleware\GetUserFromToken',
    'jwt.refresh' => 'Tymon\JWTAuth\Middleware\RefreshToken',
   ];

以上這篇laravel5.5安裝jwt-auth 生成token令牌的示例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Laravel (Lumen) 解決JWT-Auth刷新token的問(wèn)題
  • Laravel jwt 多表(多用戶端)驗(yàn)證隔離的實(shí)現(xiàn)
  • Laravel配合jwt使用的方法實(shí)例

標(biāo)簽:駐馬店 石嘴山 大同 江門 內(nèi)江 深圳 雙鴨山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《laravel5.5安裝jwt-auth 生成token令牌的示例》,本文關(guān)鍵詞  laravel5.5,安裝,jwt-auth,生成,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《laravel5.5安裝jwt-auth 生成token令牌的示例》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于laravel5.5安裝jwt-auth 生成token令牌的示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章