首頁  >  文章  >  php框架  >  一文介紹Laravel中Token的實作機制

一文介紹Laravel中Token的實作機制

PHPz
PHPz原創
2023-04-23 09:13:141671瀏覽

Laravel是一個使用PHP程式語言開發的網路應用框架,它的卓越表現得益於其內部整合大量功能強大的擴充包。其中就包括了Token的底層實作。 Token,即令牌,是Web應用程式常用的一種身份驗證方式,通常用於保護API和Web服務免受非法存取。在這篇文章中,我們將介紹Laravel中Token的實作機制。

一、令牌的概念

Token,顧名思義,就是指一種令牌,是一種標記,可以代表某種身分資訊或授權資訊。它通常由伺服器產生並發放給客戶端,客戶端收到令牌後將其存放在本地,在後續請求時加入請求頭或請求參數中,作為身份驗證或授權的標識。伺服器透過檢查令牌是否有效,就可以確定請求是否具有身份驗證或授權資訊。

令牌的使用能夠更有效地保護網路應用程式免受未經授權的訪問,尤其是在API和Web服務中,令牌是必不可少的。

二、 Laravel Token的實作

Laravel作為一款優秀的Web應用框架,在其內建的Auth功能中提供了Token的支援。在Laravel中,Token的實作使用了Laravel Sanctum這個擴充包。

2.1 Laravel Sanctum

Laravel Sanctum是一款輕量級的身份驗證包,可以為Laravel應用程式提供API身份驗證,基於API秘鑰或Token,讓應用程式更好的運行在無狀態環境中,如SPA應用程式、單頁應用程式和行動應用程式等。 Laravel Sanctum提供了以下功能:

  1. 無需配置即可開始使用;
  2. #支援使用session、Token以及API秘鑰等多種驗證方式;
  3. 內建了多種身份驗證的實現,如cookie、Token、auth等;
  4. 提供了方便的身份驗證和Token生成;
  5. 更好的自訂身份驗證流程。

2.2 Token的實作原理

在Laravel Sanctum中,Token的實作原理與session實作原理類似。在請求中,客戶端向伺服器發出請求時,將Token作為請求參數或Header中的Authorization欄位傳送給伺服器。伺服器在檢查Token是否有效,並在有效期內,給予請求操作的權限或傳回錯誤訊息。 Token的實作流程如下:

  1. 建立Token:當使用者登入時,Sanctum將為該使用者產生一個隨機的Token,並將該Token保存在後台資料庫中;
  2. 傳送Token:將Token作為請求參數或Header中的Authorization欄位傳送給伺服器;
  3. Token驗證:在伺服器端,Sanctum會檢查接收到的Token是否有效,並決定授權或拒絕;
  4. Tokens管理:Sanctum提供了一系列API來建立、撤銷、尋找和驗證Token。

三、 Laravel Token的使用

Sanctum提供了方便易用的API來使用Token,包括Token的建立、撤銷、尋找和驗證等。以下是Token的使用方式:

3.1 安裝Sanctum

在應用程式中,首先需要將Sanctum的依賴套件引入到應用程式的composer.json檔案:

composer require laravel/sanctum

安裝完成後,需要在config/app.php檔案中加入以下設定:

'providers' => [ 
    // Other service providers... 
    Laravel\Sanctum\SanctumServiceProvider::class, 
],

3.2 發布設定

在安裝完成後,需要執行下列指令來發布Sanctum的設定檔:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

3.3 設定Middleware

在使用Sanctum時,需要在對應的路由中新增中間件。在Laravel中,已經內建了API認證的中間件,可以直接呼叫。

3.4 建立Token

在登入後,可以使用以下程式碼來為目前使用者建立Token:

use Illuminate\Http\Request; 
use Illuminate\Support\Facades\Hash; 
use Illuminate\Validation\ValidationException; 
use App\Models\User; 
use Illuminate\Support\Facades\Auth; 
use Illuminate\Support\Facades\Route; 

// 创建Token 
Route::post('/api/token/create', function (Request $request) { 
    $request->validate([ 
        'email' => 'required|email', 
        'password' => 'required', 
    ]); 

    $user = User::where('email', $request->email)->first(); 

    if (! $user || ! Hash::check($request->password, $user->password)) { 
        throw ValidationException::withMessages([ 
            'email' => ['The provided credentials are incorrect.'], 
        ]); 
    } 

    return $user->createToken($request->header('User-Agent'))->plainTextToken; 
});

在上面的程式碼中,可以看到在建立Token時,使用機器的User-Agent作為額外的參數。這裡的User-Agent是一個HTTP頭,記錄了瀏覽器或應用程式的相關資訊。這個資訊將作為Token的一部分,使得Token一旦被盜用或惡意使用,可以輕鬆發現和撤銷。

3.5 撤銷Token

創建的Token一旦被盜用或失效,可以使用以下程式碼撤銷:

Auth::user()->tokens()->delete();

3.6 驗證擴充功能

#Sanctum也提供了良好的驗證擴展,可以方便地進行存取控制,程式碼如下:

use Illuminate\Http\Request; 
use Illuminate\Support\Facades\Hash; 
use Illuminate\Validation\ValidationException; 
use App\Models\User; 
use Illuminate\Support\Facades\Auth; 
use Illuminate\Support\Facades\Route; 
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable 
{
    use HasApiTokens, Notifiable;
}

使用上述程式碼之後,我們就可以在User模型中使用can介面來進行存取控制,程式碼如下:

$request->user()->can('update', $post);

在上面的程式碼中,can將根據目前使用者的角色、權限和策略,判斷使用者是否有權進行更新操作。需要注意的是,使用者需要正確實作自己的存取控制邏輯。

四、總結

在本文中,我們介紹了Laravel中Token的底層實作機制,尤其是使用Sanctum擴充包的方式。 Sanctum提供了方便易用的API,能夠快速整合到應用程式中,並提高應用程式的安全性。 Token的使用方式、建立、撤銷與管理,以及存取控制等面向均進行了詳細的解說。

在今天的網路世界中,隨著API和Web服務的廣泛應用,Token作為一種身份驗證方式,將在許多應用程式中得到更加廣泛的應用。 Laravel框架提供了良好的Token實作機制,可以更好地保護Web應用程式免受非法存取。

以上是一文介紹Laravel中Token的實作機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn