簡體   English   中英

Laravel 中間件 - 跳過護照驗證

[英]Laravel Middleware - Skip Passport Auth

我們有 2 個身份驗證中間件應用於特定路由,“external_token”和“auth:api”。 當提供外部不記名令牌時,我們對其進行檢查,如果所有值都正確,我們認為用戶已授權訪問請求的 url。

我們如何處理除護照身份驗證之外的所有其他中間件?

public function handle(Request $request, Closure $next)
{
    $token = $request->header('Bearer');

    try {

        list($JWTHeader, $JWTPayload) = JWT::verify($token, JWT::TYPE_ID_EXTERNAL);

        $this->user = User::where('external_id', $JWTPayload['external_id'])->first();

        // Can we just set $this->user and process all other middlewares except auth?

    } catch (Exception $e) {

        Log::debug($e);
    }

    $response = $next($request);

    return $response;
}

好吧,您可以做的一件事是將用戶設置在api守衛上,因此當 auth 中間件運行時,它會找到您提供的用戶。 您必須確保您的external_token中間件首先運行。

auth()->guard('api')->setUser($this->user);

另一種選擇是將您的external_token中間件轉換為 Laravel 身份驗證保護,以便您可以使用內置的身份驗證功能。 然后,您可以使用auth:api,external_token保護您的路由,如果任何一個指定的守衛成功,則身份驗證將通過。

最簡單的例子是關閉請求守衛

在您的AuthServiceProvider::boot()方法中:

// don't forget your "use" statements for all these classes

public function boot()
{
    // ...

    Auth::viaRequest('external_token_driver', function ($request) {
        $token = $request->header('Bearer');

        try {
            list($JWTHeader, $JWTPayload) = JWT::verify($token, JWT::TYPE_ID_EXTERNAL);

            return User::where('external_id', $JWTPayload['external_id'])->first();
        } catch (Exception $e) {
            Log::debug($e);
        }

        return null;
    });
}

在您的auth.php配置中:

'guards' => [
    // web, api, etc...

    'external_token' => [
        'driver' => 'external_token_driver',
    ],
],

注意:所有未經測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM