【问题标题】:Laravel Middleware - Skip Passport AuthLaravel 中间件 - 跳过 Passport Auth
【发布时间】:2019-10-02 22:47:45
【问题描述】:

我们有 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;
}

【问题讨论】:

  • 您的回复必须将您发送到不包括 auth 中间件的地方。
  • 我们仍然希望用户最终到达他们要去的地方,但只是绕过 auth 中间件。所以基本上会有2个重定向?首先重定向到除了护照以外的所有路由,然后第二个路由到他们请求的 uri?
  • 我假设至少有两个目的地,为了满足处理除身份验证之外的所有中间件,您需要一个介于身份验证之间的目的地。或者,您可以通过更新相应的中间件并将请求和闭包发送到 handle 方法来手动处理它们(不确定这将如何表现)。

标签: php laravel


【解决方案1】:

好吧,您可以做的一件事是将用户设置为 api 保护,这样当 auth 中间件运行时,它会找到您提供的用户。您必须确保您的 external_token 中间件首先运行。

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

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

最简单的例子是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',
    ],
],

注意:所有未测试。

【讨论】:

  • Ty,我会试一试并报告。
  • auth()->guard('api')->setUser($this->user); 工作得很好,你。
  • 你知道如何指定external_token中间件先执行吗?我将逻辑移到另一个包中的服务提供程序中,现在似乎护照身份验证首先执行,这不适用于第一个解决方案。
  • @MikePurcell 在Illuminate\Foundation\Http\Kernel 中有一个$middlewarePriority 属性。它包含一个中间件类数组,数组的顺序定义了它们的执行优先级。您需要在 app\Http\Kernel.php 文件中覆盖此属性,并指定中间件在优先级列表中的位置。 Documentation.
猜你喜欢
  • 2017-03-23
  • 2018-05-30
  • 2019-02-08
  • 2020-07-25
  • 2018-09-03
  • 2018-03-28
  • 2018-07-16
  • 2019-04-26
  • 1970-01-01
相关资源
最近更新 更多