首頁  >  文章  >  php框架  >  Laravel開發:如何使用Laravel Sanctum為SPA提供API驗證?

Laravel開發:如何使用Laravel Sanctum為SPA提供API驗證?

WBOY
WBOY原創
2023-06-13 09:19:041613瀏覽

Laravel開發:如何使用Laravel Sanctum為SPA提供API驗證?

隨著單頁應用程式(SPA)的流行,我們需要一種可靠的方法來保護我們的API免受未經授權的存取和攻擊。 Laravel Sanctum是Laravel提供的一個輕量級的認證系統,它為SPA提供輕鬆的身份驗證。本文將向您展示如何使用Laravel Sanctum為SPA提供API驗證。

使用Laravel Sanctum

Laravel Sanctum是Laravel 7.x版本中的官方包,用於API驗證。 Laravel Sanctum使用該API的Token來識別使用者身份,並且可以透過使用token輕鬆執行多個身份驗證的建置。

安裝Laravel Sanctum

首先,需確保已安裝Laravel框架。

要安裝laravel sanctum,可以使用下列指令

composer require laravel/sanctum

將ServiceProvider加入config/app.php檔案的providers清單。

'providers' => [
    // ...
    LaravelSanctumSanctumServiceProvider::class,

],

現在,可以執行以下命令發布必要的資料庫遷移和Sanctum配置。

php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"

執行以下命令以執行遷移:

php artisan migrate

使用Sanctum進行預設驗證

Sanctum包含API和單頁應用程式驗證的預設實作。可以透過為使用者模型使用SanctumTraitsHasApiTokens trait來啟用預設身份驗證。

將HasApiTokens trait加入到使用者模型

<?php

namespace AppModels;

use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
use LaravelSanctumHasApiTokens;

class User extends Authenticatable
{
    use Notifiable, HasApiTokens;

    // ...
}

為了更好的解釋,我們將使用一個簡單的SPA範例。假設範例的URL為http://spa.test和透過http://api.spa.test公開的API。

在Laravel中設定CORS

將下面的程式碼加入app/Providers/AppServiceProvider.php檔案中來允許跨網域資源共用(CORS)。

...
use IlluminateSupportFacadesSchema;
use IlluminateSupportFacadesURL;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Schema::defaultStringLength(191);

        if (config('app.env') === 'production') {
            URL::forceScheme('https');
        }

        $headers = [
            'Access-Control-Allow-Origin' => '*',
            'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',
            'Access-Control-Allow-Headers' => 'Origin, Content-Type, Accept, Authorization, X-Request-With',
            'Access-Control-Allow-Credentials' => 'true',
        ];
        $this->app['router']->middleware('api')->get('/sanctum/csrf-cookie', function () {
            return response()->json(['status' => 'success']);
        });

        foreach ($headers as $key => $value) {
            config(['cors.supportsCredentials' => true]);
            config(['cors.paths.api/*' => [
                'allowedOrigins' => ['http://spa.test'],
                'allowedHeaders' => [$key],
                'allowedMethods' => ['*'],
                'exposedHeaders' => [],
                'maxAge' => 86400,
            ]]);
        }
    }
}

將上述程式碼中的http://spa.test替換為您的SPA的URL。

令牌驗證和API保護說明

在控制器中,我們可以使用Sanctum的auth中間件來保護路由

public function index(Request $request)
{
    $user = $request->user();
    // ...
}

public function store(Request $request)
{
    $user = $request->user();
    // ...
}

public function destroy(Request $request, string $id)
{
    $user = $request->user();  
    // ...
}

public function update(Request $request, string $id)
{
    $user = $request->user();
    // ...
}

這會從請求標頭中獲取Sanctum授權令牌,並使用該令牌驗證使用者。如果未在標頭中提供授權令牌,則將傳回401未經授權的錯誤。

發出授權令牌請求

在我們的SPA中,我們可以使用axios函式庫來使用API​​並取得令牌。要取得授權令牌,我們需要先取得CSRF令牌,所以我們需要傳送一個GET請求來取得它。

axios.get('http://api.spa.test/sanctum/csrf-cookie').then(response => {
    axios.post('http://api.spa.test/login', {
        username: this.username,
        password: this.password
    }).then(response => {
        axios.defaults.headers.common['Authorization'] = `Bearer ${response.data.token}`;
        this.$router.push({ name: 'home' });
    });
});

上面的程式碼將在http://api.spa.test中發出POST請求,在伺服器上建立一個新的Sanctum授權令牌,並將令牌作為response.data.token進行回應。此後,我們可以將令牌新增至axios的通用頭檔中,以在SPA中使用所有後續請求。

注意,此範例假設有一個名為「login」的路由。

Sanctum也為我們提供了一個logout路由來撤銷授權令牌。

axios.post('http://api.spa.test/logout').then(response => {
    delete axios.defaults.headers.common['Authorization'];
    this.$router.push({ name: 'login' });
});

結論

Laravel Sanctum是一個輕量級的簡單實用的身份驗證系統,它易於整合和使用,並提供預設的身份驗證功能,是SPA身份驗證的絕佳解決方案。一旦您與Sanctum一起使用,您將不再需要編寫自己的身份驗證系統。它能夠讓我們為我們的API快速實現安全的身份驗證,並讓我們的SPA與API在很短的時間內互動。

以上是Laravel開發:如何使用Laravel Sanctum為SPA提供API驗證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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