Laravel Lighthouse Graphql 多重守卫

Laravel Lighthouse Graphql multiple guards

我正在尝试让我的自定义防护装置与 Lighthouse 一起对抗 GraphQL 架构,但它不起作用。

问题是 graphql 查询无法到达我的自定义守卫。

schema.graphql:(为简洁起见删除了一些代码)

extend type Query @guard(with: ["api", "partner"])
{
    GetHighscores(): [Highscore!]!
}

注意 @guard 指令,它有 apipartner。我希望他们按顺序 运行(顺便说一句,它有顺序吗?)。

现在partner守卫的定义 AuthServiceProvider@boot

Config::set('auth.guards.partner', [
    'driver' => 'partner',
]);

Auth::viaRequest('partner', function (Request $request) {
    dd('MUST GET HERE');
});

当我 运行 使用经过身份验证的不记名令牌进行查询时,不会执行守卫 partner。但是,如果我在 api 之前设置 partner 守卫,那么它就会被执行。我在这里错过了什么?

编辑

使用 CURL,我请求了一个受保护的 laravel 路由并且它有效:

Route::middleware(['auth:api', 'auth:partner'])->get('/partners', function (Request $request) {
    print_r($request->user()->toArray());
});

它打印了 dd() 消息,这是正确的。

为什么 Lighthouse 无法联系到我的海关守卫?

lighthouse @guard 指令的行为类似于 OR 指令。 如果第一个守卫通过,则永远不会检查第二个。

您可以添加两次@guard 指令。我认为这应该有效。

extend type Query @guard(with: ["api"]) @guard(with: ["partner"])
{
    GetHighscores(): [Highscore!]!
}

这是指令中的代码:

/**
 * Determine if the user is logged in to any of the given guards.
 *
 * @param  array<string>  $guards
 *
 * @throws \Illuminate\Auth\AuthenticationException
 */
protected function authenticate(array $guards): void
{
    foreach ($guards as $guard) {
        if ($this->auth->guard($guard)->check()) {
            $this->auth->shouldUse($guard);

            return;
        }
    }

    $this->unauthenticated($guards);
}

我解决了我的问题,将 API 守卫的支票移到合作伙伴守卫内:

Auth::viaRequest('partner', function (Request $request) {
    $user = auth()->user();
    if ($user &&
        $user->partner()->exists() === true &&
        auth()->guard('api')->check() === true
    ) {
        return $user;
    }
});

在 graphql 架构中:

extend type Query @guard(with: "partner")
{
    GetHighscores(): [Highscore!]!
}

我仍然认为 Lighthouse 应该像“AND”一样照顾多个守卫......无论如何,它现在正在工作。