В общем, решения по моему вопросу так и не нашёл. Кто задался таким же вопросом - рассказываю, как решил задачу.
Я использую библиотеку
https://github.com/rebing/graphql-laravel
В конфигах есть настройка схем, ну я и настроил изначально общие роуты под default, приватные - под auth:
'schemas' => [
'default' => [
'query' => [
\App\Http\GraphQL\Queries\UserQuery::class,
],
'mutation' => [
'createUser' => \App\Http\GraphQL\Mutations\CreateUserMutation::class,
],
'middleware' => [ ],
'method' => ['get', 'post'],
],
'auth' => [
'query' => [
\App\Http\GraphQL\Queries\GetMyProfileQuery::class,
],
'mutation' => [],
'middleware' => [
'api'
],
'method' => [ 'post'],
],
],
В итоге перенёс все роуты в блок default:
'schemas' => [
'default' => [
'query' => [
\App\Http\GraphQL\Queries\UserQuery::class,
\App\Http\GraphQL\Queries\GetMyProfileQuery::class,
],
'mutation' => [
'createUser' => \App\Http\GraphQL\Mutations\CreateUserMutation::class,
],
'middleware' => ['jwtAuth' ],
'method' => ['get', 'post'],
],
],
Сделал Middleware (jwtAuth), который по JWT токену пытается авторизовать юзера (если токен передан - авторизует).
Для приватных роутов сделал базовый класс с проверкой на авторизацию (соответственно, все приватные контроллеры наследую от него):
abstract class _BaseQuery extends Query
{
public function authorize(
$root,
array $args,
$ctx,
ResolveInfo $resolveInfo = null,
Closure $getSelectFields = null
): bool {
return Auth::check();
}
}
Таким образом, задача решена. Но чувство прекрасного страдает, так как мне не нравится такое решение )
Если нет возможность менять УРЛ запроса, то к чему настройки схемы в rebing/graphql-laravel...
UPD. Спустя несколько дней разработки, случайно наткнулся на решение:
import { ApolloClient, HttpLink, InMemoryCache } from "@apollo/client";
import { RetryLink } from "@apollo/client/link/retry";
const directionalLink = new RetryLink().split(
(operation) => operation.getContext().version === 1,
new HttpLink({ uri: "http://localhost:4000/v1/graphql" }),
new HttpLink({ uri: "http://localhost:4000/v2/graphql" })
);
const client = new ApolloClient({
cache: new InMemoryCache(),
link: directionalLink,
});
https://www.apollographql.com/docs/react/data/erro...