У меня есть 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,
],
Я понял, что возникли две проблемы:
- В таблице сеансов, даже если она не вошла в систему, при загрузке домашней страницы приложения (или любой страницы) в таблицу
sessions
вставляется несколько сеансов. Разве новый одиночный сеанс не должен быть вставлен в эту таблицу только после входа в систему?
После входа пользователя в систему, при обновлении страницы вручную в браузере и выполнении вызова по защищенному маршруту я получаю 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 проблемы?