2015-06-05 4 views
31

Я использую Laravel Socialite, чтобы добавить кнопку подключения Facebook на веб-сайте. Иногда у меня есть эта ошибка при обратном вызове:Laravel Socialite: InvalidStateException

exception 'Laravel\Socialite\Two\InvalidStateException' 
in /example/vendor/laravel/socialite/src/Two/AbstractProvider.php:161 

Я не знаю, что это значит и еще ничего не нашел об этой ошибке. Реальная проблема - это случайное исключение (не понимайте, почему это происходит). Итак, что означает эта ошибка и как ее избежать?

Похоже, что это не та же проблема, что и Laravel 5 geting InvalidStateException in AbstractProvider.php, потому что в моем случае это случайное.

+0

Я думаю, что это может быть проблемой, HTTP://stackoverflow.com/a/29975589/1430587 – oBo

+0

Возможный дубликат [Laravel 5 geting InvalidStateException в AbstractProvider.php] (http://stackoverflow.com/questions/29629287/laravel-5-geting-invalidstateexception-in-abstractprovider-php) –

+0

Это действительно близко, но я думаю, что это не та же проблема из-за случайности –

ответ

46

Я столкнулся с этим вопросом прошлой ночью, и решить ее следующим раствором.

Более подробную информацию о моей проблеме, я получил

InvalidStateException в AbstractProvider.php линии 182

в функции handleProviderCallback(), когда он повторно направить назад от Facebook входа в систему. Это похоже на вашу проблему.

Кроме того, я обнаружил, что моя проблема возникает, когда я открываю свой сайт без www. Когда я открываю свой сайт с www.mysite.com - никаких проблем. Сначала я думаю, что моя проблема случайна, пока у меня нет подсказки Chris Townsend ответ на вопрос - Большое спасибо.

Решение

  1. Перейти к корневой WWW, проверьте файл Laravel config/session.php
  2. Проверка сеанса Session Cookie Domain Конфигурация по умолчанию 'domain' => null, Я сделал изменения в 'domain' => 'mysite.com'.
  3. После 'php artisan cache:clear' и 'composer dump-autoload', я могу войти в систему без каких-либо вопроса с обеих www.mysite.com и mysite.com

Обязательно удалите куки из браузера при тестировании его после того, как эти изменения сделаны. Старые файлы cookie все еще могут создавать проблемы.

+4

это решило мою проблему –

+0

Исправить, но для людей, работающих на localhost и Chrome. Имейте в виду, что Chrome теперь устанавливает файлы cookie для локального хоста, поэтому проблема останется, чтобы решить добавить правильное (одно с точкой внутри) имя домена в файл hosts, а затем изменить файлы конфигурации laravel соответственно. – ggat

+0

спасибо человеку! разрешил мой, мне интересно, как вы это определили? –

0

Если вам по-прежнему нужна помощь, вы можете использовать мой код, это работает для меня. Вам просто нужно создать два маршрута и обновить таблицу пользователей. Не забудьте сделать пароль Nullable, так как вы не получите один из пользователей 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'); 

} 
0

Я установил это просто отключив на SESSION ДРАЙВЕРА как базы данных ... драйвер файл работал нормально для меня после нескольких часов, пытаясь исправить это S ...

2

Также проверьте права доступа на папку storage/framework/sessions.

В моем случае, поскольку эта папка пуста в новом проекте Laravel, она была оставлена ​​во время первоначальной фиксации в репозитории GIT. Впоследствии я создал его вручную на рабочем сервере, но, очевидно, с неправильными правами доступа, поэтому он не был доступен для записи для драйвера сеанса (если установлено 'file').

9

Т.Л., др

Если вам необходимо прочитать данный параметр state возвращаемого третьей стороны сервиса, вы можете установить Socialite, чтобы избежать этого проверки с stateless методом:

Socialite::driver($provider)->stateless(); 

Я думаю, что Socialite уже готов избежать этой проблемы.

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 очень использование Ful передавать данные Повсеместно Google:

Параметр: состояние (Любая строка)
Обеспечивает любое состояние, которое может быть полезным для вашего применения при получении ответа. Сервер Google Авторизация Сервер округляет этот параметр, поэтому ваше приложение получает то же самое значение, которое оно отправило. Возможные варианты использования включают перенаправление пользователя на нужный ресурс на ваш сайт, а также с ограничениями на межсайтовый запрос-подделка .

исх: https://developers.google.com/identity/protocols/OAuth2UserAgent#overview

+0

это сработало для меня Socialite :: driver ($ provider) -> stateless(); –

+0

Возможно, это опасно, поскольку в документах говорится: «Возможные применения включают [...] смягчение кросс-сайта-запроса-подделки». – Tim

+0

Попробуйте это http://stackoverflow.com/questions/29629287/laravel-5-geting-invalidstateexception-in-abstractprovider-php –

20

Постановили:

Socialite::driver('google')->stateless()->user() 
+0

Когда я это сделал, пользователь не был зарегистрирован после перенаправления. Я использовал auth() -> login ($ user); и т. д. – cmac

+0

Любые предложения? – cmac

+0

Обязательно добавьте 'stateless()' в свою линию перенаправления, иначе у вас могут возникнуть проблемы при входе в систему после перенаправления. «Socialite :: driver ('google') -> stateless() -> redirect()' – HelloSpeakman

-1

Я хочу поделиться вам мое решение. Я иду к моему AbstractProvider.php файл и в строке задачи

public function user() 
{ 
    if ($this->hasInvalidState()) { 
     throw new InvalidStateException; 
    } 

    // ... 
} 

Я остановить бросок нового InvalidStateException и вызвать функцию перенаправления подобное:

public function user() 
{ 
    if ($this->hasInvalidState()) { 
     $this->redirect(); 
     // throw new InvalidStateException; 
    } 

    // ... 
} 
+0

Это просто запускает auth в бесконечном цикле, не так ли? 'redirect()' для первой части процесса, тогда как 'user()' является второй частью ... – Kaktus

Смежные вопросы