Я пытаюсь использовать логин с facebook в laravel 5 с помощью Socialize .
Вот мой код файла маршрута.
Route::get('fb', function ($facebook = "facebook") { $provider = \Socialize::with($facebook); if (Input::has('code')) { $user = $provider->user(); return var_dump($user); } else { return $provider->scopes(['public_profile','user_friends'])->redirect(); } });
логин – это успех, и я получаю код, но время get $provider->user()
Я получаю ошибку.
InvalidStateException в строке AbstractProvider.php 161
Мне не нравилось просто комментировать код, который сигнализировал об ошибке (как в ответе @Dipesh Shihora), поэтому я немного откопал. Я обнаружил, что ошибка вызвана (по крайней мере, в моем случае) проблемой с сеансами.
Мой Dev-сервер настроен в соответствии с инструкциями, приведенными в этом ответе . В принципе, я «спуфинг» Google, используя URL-адрес обратного вызова, который выглядит как общедоступный адрес.
Проблема InvalidStateException
появлялась для меня, потому что я посещал мою страницу входа в http://localhost/login
и перенаправлялся на страницу входа в Google, которая затем вернула меня на http://myapp.example.com/callback
. Проблема заключается в том, что ключ сеанса хранится в файле cookie – он был первоначально cookie для http://localhost
, но когда я перенаправлялся на другой URL-адрес, cookie (и, следовательно, ключ сеанса) был недоступен. Таким образом, значение state
сеанса не существовало после обновления и исключение было выбрано.
Решение? Убедитесь, что все мои просмотры на dev-машине были выполнены по адресу http://myapp.example.com
а не по адресу http://localhost
.
http://nhagiaodich.com/dang-nhap
Он работает на моем сайте, просто звоните -> stateless (), прежде чем получить доступ
Socialite::driver('facebook')->stateless()->user() Socialite::driver('google')->stateless()->user()
Попробуйте установить правильные значения в поле 'domain'
config/session.php
и в поле 'url'
config/app.php
. Кажется, это сделал трюк для меня. Я отметил, что значение в session.php
должно быть без http://
, а одно в app.php
должно быть с http://
.
Кроме того, я рекомендую вам следовать этому руководству: https://laracasts.com/series/whats-new-in-laravel-5/episodes/9 . Это очень полезно и понятно.
$provider = \Socialize::with($facebook); if (Input::has('code')) { $user = $provider->stateless()->user(); }
Возможно, это лучшее временное решение
Поэтому после того, как вы сделали какой-то рытье, если обнаружили, что проблема для меня в том, что моя конфигурация nginx была неправильной, и параметры URL (код и состояние) не были правильно переданы в файл index.php, и таким образом проверка между состоянием из сеанса и состояние с URL-адреса не срабатывало. Я модифицировал свой nginx conf, чтобы выглядеть так, и он работал нормально.
location / { try_files $uri $uri/ /index.php?$args; }
Для тех, кто испытывает эту проблему, вы можете установить значение домена в config / session.php в свой домен и удалить все куки в своем браузере, относящиеся к вашему URL-адресу приложения. вы также можете запустить кеш php-artisan: четкие и понятные
Я не знаю, поможет ли это кому-либо, но изменение драйвера сеанса из file
в cookie
разрешило проблему InvalidException
для меня.
вы получаете эту ошибку, потому что у вас неправильные настройки вашего социального провайдера в вашем файле конфигурации или неправильно настроили приложение Facebook.
Посетите developers.facebook.com и убедитесь, что ваш идентификатор приложения и секретные ключи верны и указывают на правильный URL. Затем убедитесь, что ваш конфигурационный файл services.php приложения laravel обновлен с правильным перенаправлением, идентификатором и секретом.
Перейти к vendor/guzzlehttp/guzzle/src/Client.php
$defaults = [ 'allow_redirects' => RedirectMiddleware::$defaultSettings, 'http_errors' => true, 'decode_content' => true, 'verify' => true, 'cookies' => false ];
изменить на
$defaults = [ 'allow_redirects' => RedirectMiddleware::$defaultSettings, 'http_errors' => true, 'decode_content' => true, 'verify' => **false**, 'cookies' => false ];
Я получил временное решение для этого.
public function user() { //if ($this->hasInvalidState()) { // throw new InvalidStateException; //} $user = $this->mapUserToObject($this->getUserByToken( $token = $this->getAccessToken($this->getCode()) )); return $user->setToken($token); }
комментируйте $this->hasInvalidState()
if в файле AbstractProvider.php и оно отлично работает.