Laravel中间件-跳过护照身份验证

时间:2019-10-02 22:47:45

标签: php laravel

我们有2种auth中间件应用于特定路由,即“ 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;
}

1 个答案:

答案 0 :(得分:2)

好吧,您可以做的一件事情是将用户设置为api防护,因此,当身份验证中间件运行时,它将找到您提供的用户。您必须确保首先运行external_token中间件。

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

另一种选择是将external_token中间件转换为Laravel身份验证保护,以便您可以使用内置的身份验证功能。然后,您可以使用auth:api,external_token保护您的路由,并且如果任何一个指定的防护措施都成功,则身份验证将通过。

最简单的示例是closure request guard

在您的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',
    ],
],

NB:全部未经测试。