繁体   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