Laravel Lighthouse GraphQL: проверка подлинности паспорта не работает, даже если токен присутствует в заголовке запроса

Я работаю над проектом Laravel. Я создаю GraphQL API, используя библиотеку Lighthouse. Я использую эту библиотеку для аутентификации паспорта, https://github.com/joselfonseca/lighthouse-graphql-passport-auth. Я мог бы использовать конечные точки из этой библиотеки и сгенерировать токены доступа аутентификации. Я заранее установил и настроил Паспорт. Проблема в том, что когда я использую конечную точку / запрашиваю защищенную мутацию, она не работает. Даже если токен присутствует в заголовке, он всегда возвращает false для проверки, вошел ли пользователь в систему.

У меня есть следующее объявление схемы.

extend type Mutation @middleware(checks: ["api", "auth.restaurant-admin"]) {
    updateUserProfile(input: UpdateUserProfileInput): User! @updateUserProfileValidation
}

Как видите, это буквально мутация, защищенная промежуточным программным обеспечением api и auth.restaurant-admin.

Ниже приводится моя реализация промежуточного программного обеспечения auth.restaurant-admin.

<?php

namespace App\Http\Middleware;

use App\Models\User;
use Closure;
use Illuminate\Http\Response;

class AuthRestaurantAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (auth()->check() and auth()->user()->hasRole(User::ROLE_RESTAURANT_ADMIN)) {

            if (auth()->user()->restaurant) {
                return $next($request);
            } else {
                return abort(Response::HTTP_FORBIDDEN, 'There is no restaurant assigned to the user');
            }
        }

        return abort(Response::HTTP_FORBIDDEN, 'You are not authorised to access this part of the application');
    }
}

Метод auth()->check() всегда возвращает false, даже если действительный токен доступа присутствует в заголовке. Я передаю токен на игровой площадке GraphQL, как показано ниже.

[![enter code here][1]][1]

Когда я извлекаю токен из заголовка, например $ request- ›header (« Авторизация »), я вижу ожидаемое значение. Но auth () - ›check () просто не работает. Что не так и чего не хватает в моем коде? Как я могу это исправить?


person Wai Yan Hein    schedule 29.06.2020    source источник


Ответы (1)


Аутентификация (auth) Laravel полностью отличается от аутентификации Laravel Passport. Они не работают вместе из коробки. Auth основан на сеансе и используется в основном для веб-приложений, отличных от SPA. Laravel Passport - это, по сути, реализация полноценного сервера OAuth2 (на основе токена), который используется в основном для защиты маршрутов API. Если вы создаете веб-приложение SPA (например, React или Vue) или приложение, которое вызывает API или GraphQL, вы должны использовать его для защиты этих маршрутов.

Чтобы узнать, как вы может проверить, имеет ли пользователь правильную роль или разрешение.

Надеюсь, это поможет!

person Ben Wong    schedule 29.06.2020