首頁  >  文章  >  php框架  >  Laravel開發:如何使用Laravel Passport實現API OAuth2身份驗證?

Laravel開發:如何使用Laravel Passport實現API OAuth2身份驗證?

WBOY
WBOY原創
2023-06-13 23:13:54915瀏覽

隨著API的使用逐漸普及,保護API的安全性和可擴充性變得越來越關鍵。而OAuth2已經成為了一種廣泛採用的API安全協議,它允許應用程式透過授權來存取受保護的資源。為了實現OAuth2身份驗證,Laravel Passport提供了一種簡單、靈活的方式。在本篇文章中,我們將學習如何使用Laravel Passport實現API OAuth2身份驗證。

Laravel Passport是官方提供的OAuth2伺服器庫,可以輕鬆地新增OAuth2身份驗證到您的Laravel應用程式。它針對Laravel框架的用戶端提供了API身份驗證,透過token來保護API並限制資源的存取。透過很少的設定步驟,你可以建立一個安全的OAuth2伺服器並為你的API提供身份驗證和授權。

為了開始使用Laravel Passport,你需要安裝它。你可以透過Composer套件管理器安裝它:

composer require laravel/passport

一旦你安裝了Laravel Passport,你需要執行migrations來建立必要的資料庫表:

php artisan migrate

為了啟用Laravel Passport,你需要註冊ServiceProvider和中間件。在config/app.php檔案中加入以下ServiceProvider和中間件:

'providers' => [
    // ...
    LaravelPassportPassportServiceProvider::class,
],

'middleware' => [
    // ...
    LaravelPassportHttpMiddlewareCreateFreshApiToken::class,
],

Laravel Passport需要一個用於發行access token和refresh token的「keys」表。執行以下命令將產生此表:

php artisan passport:install

這會建立一個加密的RSA秘鑰對用於簽署和驗證tokens,以及一個名為「personal_access_client」的客戶端和一個名為「password_client」的客戶端。這兩個客戶端用於建立不同類型的tokens。第一個客戶端用於產生個人存取tokens,這些tokens允許客戶端存取任何以OAuth2身份驗證方式保護的API端點。第二個客戶端用於建立密碼授權tokens,這些tokens允許客戶端透過使用者名稱和密碼取得access token。

在這個過程中,你還需要在你的config/auth.php檔案中設定Laravel Passport。你需要將passport硬碟加入到API守衛,以便Laravel Passport來處理一切與OAuth2相關的東西。範例如下:

'guards' => [
    // ...
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

現在我們已經完成了設置,我們可以開始建立API路由和控制器了。

首先,你需要定義API路由。例如,假設你有一個API端點來取得一個任務清單:

Route::get('/tasks', 'TaskController@index')->middleware('auth:api');

接下來,你需要建立一個控制器來處理請求並回應任務:

class TaskController extends Controller
{
    public function index()
    {
        $tasks = Task::all();

        return response()->json([
            'tasks' => $tasks,
        ]);
    }
}

在middleware方法中加入“ auth:api」參數以指示我們使用API​​守衛來保護路由。

現在讓我們看看如何執行OAuth2驗證並獲得access token。你需要建立一個客戶端,該客戶端將使用密碼授權OAuth2 flow來獲得access token。這樣你就可以透過API請求在API端點上進行身份驗證了。

你可以在Laravel Passport的客戶端清單中建立一個新客戶端,或是在你的程式碼中使用Passport::client()方法為客戶端產生一個隨機的client id和client secret。你可以將client id和client secret保存在你的.env檔或你可以在你的Passport::client()方法中直接提供它們。此方法將建立一個新的客戶端,並傳回client id和client secret:

use LaravelPassportClient;
use IlluminateSupportFacadesDB;

$client = $this->createClient();

public function createClient()
{
    $client = Client::forceCreate([
        'user_id' => null,
        'name' => 'Test Client',
        'secret' => str_random(40),
        'redirect' => '',
        'personal_access_client' => false,
        'password_client' => true,
        'revoked' => false,
    ]);

    DB::table('oauth_client_grants')->insert([
        'client_id' => $client->id,
        'grant_id' => 1,
    ]);

    return $client;
}

現在我們已經有了一個客戶端,我們需要在控制器中使用Laravel Passport來取得access token並使用它來存取受保護的API端點。我們需要使用以下程式碼在控制器中實現OAuth2身份驗證:

use IlluminateSupportFacadesAuth;
use LaravelPassportClientRepository;

class TaskController extends Controller
{
    protected $clients;
    
    public function __construct(ClientRepository $clients)
    {
        $this->clients = $clients;
    }

    public function index()
    {
        $client = $this->clients->find(2);

        $response = $this->actingAsClient($client, function () {
            return $this->get('/api/tasks');
        });

        return $response->getContent();
    }

    protected function actingAsClient($client, $callback, $scopes = [])
    {
        $proxy = new LaravelPassportHttpControllersAccessTokenController();

        $token = $proxy->issueToken(
            $this->getPersonalAccessTokenRequest($client, $scopes)
        );

        Auth::guard('web')->loginUsingId($client->user_id);

        $callback($token);

        return $this->app->make(IlluminateHttpRequest::class);
    }

    protected function getPersonalAccessTokenRequest($client, $scopes = [])
    {
        $data = [
            'grant_type' => 'client_credentials',
            'client_id' => $client->id,
            'client_secret' => $client->secret,
            'scope' => implode(' ', $scopes),
        ];

        return IlluminateHttpRequest::create('/oauth/token', 'POST', $data);
    }
}

使用actingAsClient()方法,我們可以模擬以客戶端身份運行請求,控制器中的任何方法都可以使用該方法進行OAuth2身份驗證。我們需要傳遞一個客戶端對象,一個回呼函數以執行API請求,並可選地傳遞新增到請求中的權限。

現在我們已經完成了Laravel Passport的OAuth2身份驗證配置,透過使用上述程式碼模式,我們可以輕鬆地在我們的API端點上實現安全的OAuth2身份驗證。 Passport是一個相對較新的項目。但是,它是與Laravel完美整合的,並且提供了多種OAuth2身份驗證服務,使您能夠輕鬆地在您的API中添加身份驗證和授權。如果你正在運行Laravel應用程式並需要添加OAuth2身份驗證,Laravel Passport是實現此目的的理想選擇。

以上是Laravel開發:如何使用Laravel Passport實現API OAuth2身份驗證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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