Laravel 5.6 - Как аутентифицировать API, используя сеансы для одной и той же папки SPA? - PullRequest
0 голосов
/ 16 января 2019

У меня есть React SPA в том же проекте Laravel. Вход / регистрация / выход из системы и все другие представления js находятся в папке js и используют вызовы axios api для всех POST/GET запросов. Я хочу использовать веб-аутентификацию на основе сеанса Laravel по умолчанию для встроенного SPA, поскольку она находится в той же папке проекта и будет иметь доступ к клиенту javascript only . Этот API-интерфейс не должен быть открыт для публики, только для этого приложения реагирования, и это SPA для скорости и хорошего пользовательского опыта вместо полной перезагрузки страницы.

Я пытался использовать Паспорт и раньше, и уже больше месяца я не могу заставить его работать так, как задумано. Я не хочу иметь дело с токенами, токенами доступа, обновлять токены, отзывать токены, CSRF и т. Д. Просто из коробки простая аутентификация на основе сеансов Laravel, которая так легко работает в сети, но хочу, чтобы она работала в моем приложении реакции. Единственный блейд-файл - это index.blade.php, который включает в себя реакцию app.js

Есть идеи, как этого добиться?

ОБНОВЛЕНИЕ 1:

После реализации предложения @ ceejayoz:

Вы должны добавить различные промежуточные программы Session / Cookie в app / Http / Kernel.php (такие вещи, как \ Illuminate \ Session \ Middleware \ StartSession :: class) для маршрутов API.

Я добавил к $middlewareGroups.api, чтобы соответствовать промежуточному программному обеспечению web в app/Http/Kernel.php:

'api' => [
    'throttle:60,1',
    'bindings',
    // Newly added middleware to match web middleware
    \App\Http\Middleware\EncryptCookies::class
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],

Я понял, что возникли две проблемы:

  1. В таблице сеансов, даже если она не вошла в систему, при загрузке домашней страницы приложения (или любой страницы) в таблицу sessions вставляется несколько сеансов. Разве новый одиночный сеанс не должен быть вставлен в эту таблицу только после входа в систему?
  2. После входа пользователя в систему, при обновлении страницы вручную в браузере и выполнении вызова по защищенному маршруту я получаю 401 Unauthenticated, который указывает мне на этот метод в Illuminate/Auth/GuardHelpers.php:

    public function authenticate() {
        if (! is_null($user = $this->user())) {
            return $user;
        }
    
        throw new AuthenticationException; // throws this 401 exception on logged in page refresh when fetching data from private route
    }
    

Некоторые дополнительные примечания:

  • В config/auth.php я обновил guards.api.driver до session вместо token.
  • В routes/api.php У меня есть защищенные маршруты, завернутые в промежуточное программное обеспечение auth, как это: Route::group(['middleware' => 'auth'], function() { PRIVATE ROUTES HERE }
  • В config/session.php У меня 'domain' => '.mydomain.com'
  • Я отправляю эти заголовки с каждым запросом Axios API следующим образом:

    window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
    let token = document.head.querySelector('meta[name="csrf-token"]');
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
    

Есть идеи, как мы можем исправить эти 2 проблемы?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Похоже, ваш сеанс не был постоянным.

Проверьте, изменились ли какие-либо значения в config/session.php, которые могут создавать проблемы.

Вы можете проверить значения конфигурации сеанса по умолчанию здесь

Из комментариев @Wonka решил свою проблему, изменив

'same_site' => 'strict'

до

'same_site' => null
0 голосов
/ 16 января 2019

Это выполнимо (и я сделал то же самое для некоторых приложений).

По умолчанию маршруты в routes/api.php не имеют доступных сеансов, но вы можете добавить различные промежуточные программы Session / Cookie в app/Http/Kernel.php (например, \Illuminate\Session\Middleware\StartSession::class) к маршрутам API.

Вы можете, как предложил @ljubadr, также вместо этого указать маршруты API в routes/web.php, хотя это, вероятно, означает, что вам нужно будет внести другие изменения (например, снять защиту CSRF с веб-маршрутов).

...