Я использую Laravel Socialite, чтобы добавить кнопку подключения Facebook на веб-сайте. Иногда у меня есть эта ошибка при обратном вызове:
exception 'Laravel\Socialite\Two\InvalidStateException' in /example/vendor/laravel/socialite/src/Two/AbstractProvider.php:161
Я не знаю, что это значит и еще ничего не нашел об этой ошибке. Реальная проблема – это случайное исключение (не понимайте, почему это происходит). Итак, что означает эта ошибка и как ее избежать?
Кажется, это не та же проблема, что и Laravel 5, получая InvalidStateException в AbstractProvider.php , потому что в моем случае это случайное.
Я столкнулся с этим вопросом вчера вечером и решил его с помощью следующего решения.
Больше информации о моей проблеме, у меня есть
InvalidStateException в строке AbstractProvider.php 182
в функции handleProviderCallback()
когда он перенаправляет обратно из входа в Facebook. Это похоже на вашу проблему.
Кроме того, я обнаружил, что моя проблема возникает, когда я открываю свой сайт без www
. Когда я открываю свой сайт с www.mysite.com
– никаких проблем. Сначала я думаю, что моя проблема случайна, пока я не понял ответ Криса Таунсенда на вопрос – Большое спасибо.
Решение
config/session.php
'domain' => 'mysite.com'
сеанса Конфигурация по умолчанию – 'domain' => null,
я внес изменения в 'domain' => 'mysite.com'
. 'php artisan cache:clear'
и 'composer dump-autoload'
я могу войти без проблем с mysite.com
и mysite.com
Обязательно удалите файлы cookie из браузера при его тестировании после выполнения этих изменений. Старые файлы cookie все еще могут создавать проблемы.
Решено:
Socialite::driver('google')->stateless()->user()
ТЛ; др
Если вам нужно прочитать заданное state
параметра, возвращенное службой третьей стороны, вы можете настроить Socialite, чтобы избежать этой проверки с помощью метода stateless
:
Socialite::driver($provider)->stateless();
Я думаю, что социалист уже готов избежать этой проблемы.
https://github.com/laravel/socialite/blob/2.0/src/Two/AbstractProvider.php#L77
/** * Indicates if the session state should be utilized. * * @var bool */ protected $stateless = false;
https://github.com/laravel/socialite/blob/2.0/src/Two/AbstractProvider.php#L374
/** * Indicates that the provider should operate as stateless. * * @return $this */ public function stateless() { $this->stateless = true; return $this; }
https://github.com/laravel/socialite/blob/2.0/src/Two/AbstractProvider.php#L222
/** * Determine if the current request / session has a mismatching "state". * * @return bool */ protected function hasInvalidState() { if ($this->isStateless()) { return false; // <-------- } $state = $this->request->getSession()->pull('state'); return ! (strlen($state) > 0 && $this->request->input('state') === $state); }
Например, state
очень полезно для передачи данных через google:
Параметр: состояние (любая строка)
Предоставляет любое состояние, которое может быть полезно для вашего приложения после получения ответа. Сервер авторизации Google округляет этот параметр, поэтому ваше приложение получает то же самое значение, которое оно отправило. Возможные варианты использования включают перенаправление пользователя на правильный ресурс на вашем сайте и смягчение межсайтового запроса-подделки.
ref: https://developers.google.com/identity/protocols/OAuth2UserAgent#overview
Также проверьте доступ прямо к папке storage/framework/sessions
.
В моем случае, поскольку эта папка пуста в новом проекте Laravel, она была оставлена во время первоначальной фиксации в репозитории GIT. Впоследствии я создал его вручную на рабочем сервере, но, очевидно, с неправильными правами доступа, поэтому он не был доступен для записи для драйвера сеанса (если установлен 'file'
).
Если вам все еще нужна помощь, вы можете использовать мой код, он работает для меня. Вам просто нужно создать два маршрута и обновить таблицу пользователей. Не забудьте сделать пароль нулевым, так как вы не получите его от пользователей facebook. Код в моем контроллере:
public function redirectToProvider() { return Socialize::with('facebook')->redirect(); } public function handleProviderCallback(User $user) { $money = Socialize::with('facebook')->user(); if(User::where('email', '=', $money->email)->first()){ $checkUser = User::where('email', '=', $money->email)->first(); Auth::login($checkUser); return redirect('home'); } $user->facebook_id = $money->getId(); $user->name = $money->getName(); $user->email = $money->getEmail(); $user->avatar = $money->getAvatar(); $user->save(); Auth::login($user); return redirect('home'); }
Я исправил это, просто отключив SESSION DRIVER как базу данных … драйвер файла работал отлично для меня после нескольких часов, пытаясь исправить это …
Я хочу поделиться с вами своим решением. Я иду в свой файл AbstractProvider.php
и в строке проблемы
public function user() { if ($this->hasInvalidState()) { throw new InvalidStateException; } // ... }
Я останавливаю throw new InvalidStateException
и вызываю функцию перенаправления следующим образом:
public function user() { if ($this->hasInvalidState()) { $this->redirect(); // throw new InvalidStateException; } // ... }
сталкивался с такой же проблемой
это решило мою проблему
$ providerUser = Socialite :: with ('facebook') -> user ();