![](/img/trans.png)
[英]Laravel Passport “auth:api” middleware acts as “web, auth” middleware
[英]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.