reglas indexon firestore common auth firebase firebase-security firebasesimplelogin

indexon - Firebase authWithOAuthRedirect() aflicciones



indexon firebase (2)

Estoy intentando actualizar mi aplicación angularjs para que sea compatible con Firebase 1.1 (me quedé con Firebase 1.0.x).
Desaprueba firebasesimplelogin, incluida la autenticación dentro del núcleo de Firebase.

Pude implementar exitosamente la autenticación usando

authWithOAuthPopup("<provider>", function(error, authData) { ... });

Acepta una devolución de llamada, que se pasa datos de autenticación en authData .

Por el contrario, no puedo entender cómo usar

authWithOAuthRedirect("<provider>", function(error) { ... });

La página de documentos de Firebase Authentication es muy concisa ... :-(. Esto es todo lo que se dice:

Alternativamente [en lugar de authWithOAuthPopup], puede solicitar al usuario que inicie sesión con un redireccionamiento completo del navegador, y Firebase restaurará automáticamente la sesión cuando regrese a la página de origen

¿Cómo obtengo authData cuando Firebase, después de la redirección, vuelve a mi página?


Creo que me encuentro con el mismo problema que tú. Estoy tratando de hacer la autenticación de Facebook.

Primero, me gustaría aclarar los pasos de reproducción para mi problema.

  1. Mi aplicación está cargada en el cliente.
  2. El usuario hace clic en iniciar sesión con Facebook.
  3. ref.authWithOAuthRedirect (''facebook'', ...) se llama.
  4. El cliente es redirigido a Facebook y Facebook redirige al cliente a la aplicación de Firebase
  5. A pesar de la autenticación exitosa con Facebook, la devolución de llamada pasada a onAuth () se invoca (solo una vez) con authData === null.

La devolución de llamada pasada a onAuth () no se invoca una segunda vez con authData correcto.

Sin embargo, volver a cargar la aplicación hace que la devolución de llamada pasada a onAuth se invoque con authData correcto. Los motivos de esto no los conozco, pero sospecho la condición de raza.

Aquí está mi solución.

Antes de llamar a ref.authWithOAuthRedirect (''facebook'', ...) establézcase una bandera en sessionStorage.

sessionStorage.reload = true; ref.authWithOAuthRedirect(''facebook'', ...)

Cuando el cliente sea redireccionado a su aplicación desde Facebook, debería poder verificar esta bandera y volver a cargar la página si es necesario.

if (sessionStorage.reload) { delete sessionStorage.reload; setTimeout(function() { location.reload(); }, 1000) }

setTimeout (function () {...}, 1000) ayuda a combatir la condición de carrera asumida. Descubrí que 500 ms es tiempo insuficiente para resolver la condición de carrera.

Y un pequeño error: si recarga la página demasiado pronto, entonces authData sigue siendo nula, sin importar cuántas veces vuelva a cargar la página.