Laravel Socialite: InvalidStateException (иногда)

некоторые пользователи на моем сайте испытывают Laravel\Socialite\Two\InvalidStateException, Я предпринял шаги, описанные в ответах на Laravel Socialite: InvalidStateException, и не смог решить эту проблему. Только небольшой процент пользователей, кажется, испытывают это.

У меня есть 2 док-контейнера fpm/nginx, которые находятся за балансировщиком нагрузки HAProxy.

3 ответа

Кажется, это некорректная проблема состояния в пакете социальной сети, которая уже решена в этом посте.

Некоторые из ваших пользователей обращаются к вашему веб-сайту с другим URL-адресом ( https://www.example.com/ или https://example.com/), в результате чего возникает несоответствие "состояния" в сеансах.

Если вы используете Larvel 5.3 и выше... добавьте SESSION_DOMAIN=http://example.com в .env файл

Для других версий перейдите на ваш config/session.php файл, и добавьте свой домен. 'domain' => 'www.example.com'

Чтобы применить изменения немедленно. Бежать 'php artisan cache:clear' а также 'composer dump-autoload' Надеюсь, это должно решить проблему.

Могу поспорить, что проблема возникает из-за балансировки нагрузки. Вот моя теория:

  1. Липкие сеансы: если ваш балансировщик нагрузки не настроил липкий сеанс должным образом, некоторые пользователи могут начать новый сеанс на сервере 1, а по следующему запросу он заканчивается на сервере 2, который, возможно, выбрасывает Laravel\Socialite\Two\InvalidStateException

  2. Тайм-аут запроса: я не уверен в этом, но, возможно, времени вашей сессии недостаточно для завершения некоторого процесса, который также выдает Laravel\Socialite\Two\InvalidStateException

Возможно, если вы измените хранилище сеансов laravel на децентрализованную базу данных вместо конфигурации текстового файла по умолчанию, исключение будет решено.

В вашем производственном env-файле просто добавьте SESSION_DOMAIN = http://example.com/ чтобы он был выбран вашим config/session.php. Для местного развития вам это не понадобится.

Заменить

Socialite::driver('google')->user();

к этому коду

Socialite::driver('google')->stateless()->user();

любые социальные

Другие вопросы по тегам