У меня есть React SPA в том же проекте Laravel. Вход в систему / регистрация / выход из системы и все другие представления js находятся в папке js и используют вызовы api axios для всех запросов POST/GET
. Я хочу использовать веб-аутентификацию на основе сеанса Laravel по умолчанию для встроенного SPA, поскольку он находится в той же папке проекта и будет единственным клиентом javascript, имеющим к нему доступ. Этот api не должен быть открытым для публики, только для этого реагирующего приложения, и это SPA для скорости и хорошего взаимодействия с пользователем вместо полной перезагрузки страницы.
Я пробовал использовать Passport раньше и больше месяца я все еще не могу заставить его работать должным образом. Я не хочу иметь дело с токенами, токенами доступа, токенами обновления, отзывом токенов, 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
у меня есть защищенные маршруты, завернутые в промежуточное ПО для аутентификации, например:Route::group(['middleware' => 'auth'], function() { PRIVATE ROUTES HERE }
- В
config/session.php
у меня'domain' => '.mydomain.com'
Я отправляю эти заголовки с каждым запросом api axios следующим образом:
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 проблемы?
app/Http/Kernel.php
(например,\Illuminate\Session\Middleware\StartSession::class
) в маршруты API. - person ceejayoz   schedule 16.01.2019/api
, вы можете просто определить их вroutes/web.php
, а не вroutes/api.php
. Убедитесь, что вы включилиauth
промежуточное ПО. Затем вы можете поместить их в группуRoute::group(['prefix' => 'api', 'middleware' => ['auth'],], function () {...
- person ljubadr   schedule 16.01.2019api.php
как есть и не перемещать его вweb.php
, используя потрясающую технику ceejayoz. Просто нужно было обновить auth: api до auth, и это сработало. Спасибо за ваш комментарий! - person Wonka   schedule 16.01.2019web
промежуточное ПО. Сессии создаются, даже если пользователь не вошел в систему. - person ljubadr   schedule 17.01.2019web
промежуточное ПО применяется к маршрутам web.php. Возможно, вы можете попробовать отладить сеанс, проверьте этот вопрос. Если вы звонитеindex.blade.php
, возможно, распечатайте адрес электронной почты пользователя на странице и посмотрите, сохраняется ли он после перезагрузки страницы и не потерян ли сеанс. Все ли вызовы ajax (GET, POST, ...) возвращают 401 после обновления страницы? - person ljubadr   schedule 18.01.2019Auth::user()->email
в лезвии, он показываетno auth email
до и после входа в систему, при обновлении страницы он показывает адрес электронной почты пользователя, но получаю ошибку 401 ajax, затем обновляю страницу снова и показывает 'no auth email', и на все будущее обновляет сообщение «no auth email» и постоянно 401 для вызовов ajax для маршрутов, защищенных auth, незащищенные маршруты всегда загружают данные без ошибок через ajax. - person Wonka   schedule 18.01.2019config/session.php
у меня была последняя переменная'same_site' => 'strict'
после изменения ее на'same_site' => null
ошибка 401 исчезла, и все работает отлично. Я хотел бы наградить вас наградой, так как вы очень помогли мне в этом и указали мне правильное направление. Я сделаю это, как только вы опубликуете ответ относительно проверки и изменения переменнойconfig/session.php
. Я очень ценю это, большое вам спасибо! - person Wonka   schedule 18.01.2019same_site => null
. Думаю, ты когда-то его изменил :) Скоро добавлю ответ - person ljubadr   schedule 18.01.2019app.js
из своего blade-сервера в производственной среде (без CORS), вы также можете изучить прокси-сервер для разработки веб-пакетов. По ссылке Проксирование некоторых URL-адресов может быть полезно, если у вас есть отдельный сервер разработки API-интерфейса и вы хотите отправлять запросы API в том же домене. Таким образом вы можете удалить CORS (если у вас есть код для что) - person ljubadr   schedule 19.01.2019