socialite sesion scotch logueo loguearse inicio con php facebook laravel laravel-5

php - sesion - Laravel Socialite: InvalidStateException



logueo con facebook laravel (10)

Me encontré con este problema anoche y lo resolví con la siguiente solución.

Más información sobre mi problema, tengo

InvalidStateException en AbstractProvider.php línea 182

en la función handleProviderCallback() cuando se vuelve a dirigir desde el inicio de sesión de Facebook. Parece ser lo mismo que tu problema.

Además, descubrí que mi problema ocurre cuando abro mi sitio sin www . Cuando abro mi sitio con www.mysite.com , no hay problema. Al principio, creo que mi problema es aleatorio hasta que tengo la pista de la respuesta de Chris Townsend a la pregunta. Muchas gracias.

La solución

  1. Vaya a su www raíz, verifique el archivo laravel config/session.php
  2. Comprobar sesión Dominio de cookies de sesión La configuración predeterminada es ''domain'' => null, realicé un cambio en ''domain'' => ''mysite.com'' .
  3. Después de ''php artisan cache:clear'' y ''composer dump-autoload'' , puedo iniciar sesión sin problemas tanto en www.mysite.com como en mysite.com

Asegúrese de eliminar sus cookies del navegador cuando lo pruebe después de realizar estas modificaciones. Las cookies antiguas aún pueden producir problemas.

Estoy usando Laravel Socialite para agregar un botón de conexión de Facebook en un sitio web. A veces, tengo este error en la devolución de llamada:

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

No sé lo que significa y aún no encontré nada sobre este error. El verdadero problema es que parece ser una excepción aleatoria (no entiendo por qué sucede). Entonces, ¿qué significa este error y cómo evitarlo?

Parece que no es el mismo problema que Laravel 5 al generar InvalidStateException en AbstractProvider.php , porque en mi caso es aleatorio.


Quiero compartir mi solución. Voy a mi archivo AbstractProvider.php y en la línea de problema

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

InvalidStateException lanzar la nueva InvalidStateException y llamo a la función de redirección de la siguiente manera:

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


Resuelto

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


Si aún necesita ayuda, puede usar mi código, me funciona. Solo necesita crear dos rutas y actualizar la tabla de usuarios. No olvides hacer una contraseña con nulos, ya que no obtendrás uno de los usuarios de Facebook El código en mi controlador:

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''); }


Solo estaba experimentando este error al iniciar sesión a través de la web móvil con la aplicación de Facebook en lugar de Facebook en el navegador. La aplicación de Facebook utiliza el navegador de Facebook después de iniciar sesión en lugar de su navegador actual, por lo que desconoce el estado anterior.

try { $socialite = Socialite::driver($provider)->user(); } catch (InvalidStateException $e) { $socialite = Socialite::driver($provider)->stateless()->user(); }


Solucioné esto simplemente deshabilitando el controlador de sesión como base de datos ... controlador de archivo funcionó bien para mí después de horas tratando de arreglar este s ...


También verifique el acceso directamente en su carpeta de storage/framework/sessions .

En mi caso, dado que esta carpeta está vacía en el nuevo proyecto de Laravel, se ha omitido durante el compromiso inicial con el repositorio de GIT. Después lo creé manualmente en el servidor de producción, pero obviamente con los derechos de acceso incorrectos, por lo tanto, no era escribible para el controlador de sesión (cuando se configuraba como ''file'' ).


Tuve el mismo problema y acabo de borrar el caché para resolver este problema. Acabo de ejecutar este comando y comencé el proceso nuevamente.

php artisan cache:clear

Espero que esta respuesta pueda ayudar a alguien.


esto lo resolvió para mí
$request->session()->put(''state'',Str::random(40)); $user = Socialite::driver(''github'')->stateless()->user();


tl; dr

Si necesita leer un state parámetro dado devuelto por un servicio de terceros, puede configurar Socialite para evitar esta comprobación con el método stateless :

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

Creo que Socialite ya está preparado para evitar este problema.

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); }

Por ejemplo, state es muy útil para pasar datos a través de google:

Parámetro: estado (Cualquier cadena)
Proporciona cualquier estado que pueda ser útil para su aplicación al recibir la respuesta. El Servidor de Autorización de Google realiza un viaje de ida y vuelta a este parámetro para que su aplicación reciba el mismo valor que envió. Los posibles usos incluyen redirigir al usuario al recurso correcto en su sitio, y mitigaciones de falsificación de solicitudes entre sitios.

ref: https://developers.google.com/identity/protocols/OAuth2UserAgent#overview