Autentica mediante el Acceso con Google y JavaScript
Puedes permitir que tus usuarios realicen autenticaciones con Firebase mediante sus Cuentas de Google. Para ello, debes integrar el Acceso con Google en tu app. Puedes integrarlo ya sea mediante el uso del SDK de Firebase para llevar a cabo el flujo de acceso o puedes hacerlo de forma manual y pasar el token de ID resultante a Firebase.
En la pestaña Método de acceso, habilita el método de acceso de Google y haz clic en Guardar.
Maneja el flujo de acceso con el SDK de Firebase
Si estás compilando una app web, la manera más fácil de autenticar a tus usuarios en Firebase con sus Cuentas de Google es administrar el flujo de acceso con el SDK de Firebase JavaScript. Si deseas autenticar a un usuario en Node.js o en cualquier otro entorno que no sea de un navegador, debes manejar el flujo de acceso de forma manual.
Para manejar el flujo de acceso con el SDK de Firebase JavaScript, sigue estos pasos:
Crea una instancia del objeto del proveedor de Google:
var provider = new firebase.auth.GoogleAuthProvider();
Opcional: Especifica los alcances adicionales de OAuth 2.0 que deseas solicitarle al proveedor de autenticación. Para agregar un alcance, llama a addScope. Por ejemplo:
Opcional: Para ajustar el OAuth del proveedor según el idioma de preferencia del usuario sin pasar de forma explícita los parámetros OAuth personalizados pertinentes, actualiza el código de idioma en la instancia Auth antes de iniciar el flujo de OAuth. Por ejemplo:
firebase.auth().languageCode = 'it';
// To apply the default browser preference instead of explicitly setting it.
// firebase.auth().useDeviceLanguage();
Opcional: Especifica los parámetros personalizados adicionales del proveedor de OAuth que quieres enviar junto con la solicitud de OAuth. Para agregar un parámetro personalizado, llama a setCustomParameters en el proveedor inicializado con un objeto que contenga la clave que se indica en la documentación del proveedor de OAuth y su valor correspondiente. Por ejemplo:
Autentica con Firebase a través del objeto del proveedor de Google. Puedes pedirle a los usuarios que accedan con sus cuentas de Google a través de una ventana emergente o redireccionándolos a la página de acceso. En dispositivos móviles, se prefiere el método de redireccionamiento.
Para acceder con una ventana emergente, llama a signInWithPopup:
firebase.auth()
.signInWithPopup(provider)
.then((result) => {
/** @type {firebase.auth.OAuthCredential} */
var credential = result.credential;
// This gives you a Google Access Token. You can use it to access the Google API.
var token = credential.accessToken;
// The signed-in user info.
var user = result.user;
// ...
}).catch((error) => {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// The email of the user's account used.
var email = error.email;
// The firebase.auth.AuthCredential type that was used.
var credential = error.credential;
// ...
});
Además, ten en cuenta que puedes recuperar el token de OAuth del proveedor de Google que se puede usar para obtener datos adicionales mediante las API de Google.
Luego, para recuperar el token de OAuth del proveedor de Google, puedes llamar a getRedirectResult cuando se cargue tu página:
firebase.auth()
.getRedirectResult()
.then((result) => {
if (result.credential) {
/** @type {firebase.auth.OAuthCredential} */
var credential = result.credential;
// This gives you a Google Access Token. You can use it to access the Google API.
var token = credential.accessToken;
// ...
}
// The signed-in user info.
var user = result.user;
}).catch((error) => {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// The email of the user's account used.
var email = error.email;
// The firebase.auth.AuthCredential type that was used.
var credential = error.credential;
// ...
});
Maneja errores de cuentas que ya existen con otras credenciales
Si habilitaste la configuración Una cuenta por dirección de correo electrónico en Firebase console, aparecerá el error auth/account-exists-with-different-credential junto con un objeto AuthCredential (token de ID de Google) cuando un usuario trate de acceder a un proveedor (como Google) con un correo electrónico que ya está vinculado al proveedor de otro usuario de Firebase (como Facebook). Para completar el acceso al proveedor, el usuario primero debe acceder al proveedor existente (Facebook) y, luego, establecer el vínculo con el AuthCredential anterior (token de ID de Google).
Modo de ventanas emergentes
Si usas signInWithPopup, puedes manejar los errores auth/account-exists-with-different-credential con un código como el siguiente:
// Step 1.
// User tries to sign in to Google.
auth.signInWithPopup(new firebase.auth.GoogleAuthProvider()).catch(function(error) {
// An error happened.
if (error.code === 'auth/account-exists-with-different-credential') {
// Step 2.
// User's email already exists.
// The pending Google credential.
var pendingCred = error.credential;
// The provider account's email address.
var email = error.email;
// Get sign-in methods for this email.
auth.fetchSignInMethodsForEmail(email).then(function(methods) {
// Step 3.
// If the user has several sign-in methods,
// the first method in the list will be the "recommended" method to use.
if (methods[0] === 'password') {
// Asks the user their password.
// In real scenario, you should handle this asynchronously.
var password = promptUserForPassword(); // TODO: implement promptUserForPassword.
auth.signInWithEmailAndPassword(email, password).then(function(result) {
// Step 4a.
return result.user.linkWithCredential(pendingCred);
}).then(function() {
// Google account successfully linked to the existing Firebase user.
goToApp();
});
return;
}
// All the other cases are external providers.
// Construct provider object for that provider.
// TODO: implement getProviderForProviderId.
var provider = getProviderForProviderId(methods[0]);
// At this point, you should let the user know that they already has an account
// but with a different provider, and let them validate the fact they want to
// sign in with this provider.
// Sign in to provider. Note: browsers usually block popup triggered asynchronously,
// so in real scenario you should ask the user to click on a "continue" button
// that will trigger the signInWithPopup.
auth.signInWithPopup(provider).then(function(result) {
// Remember that the user may have signed in with an account that has a different email
// address than the first one. This can happen as Firebase doesn't control the provider's
// sign in flow and the user is free to login using whichever account they own.
// Step 4b.
// Link to Google credential.
// As we have access to the pending credential, we can directly call the link method.
result.user.linkAndRetrieveDataWithCredential(pendingCred).then(function(usercred) {
// Google account successfully linked to the existing Firebase user.
goToApp();
});
});
});
}
});
Modo de redireccionamiento
Este error se maneja de manera similar en el modo de redireccionamiento, con la diferencia de que la credencial pendiente debe almacenarse en caché entre acciones de redireccionamiento de páginas (por ejemplo, el uso de almacenamiento de sesión).
Avanzado: Administra el flujo de acceso manualmente
También puedes realizar la autenticación con Firebase a través de una cuenta de Google. Para ello, debes manejar el flujo de acceso con Google Sign-In SDK:
Para integrar el Acceso con Google en tu app, sigue los pasos de la guía de integración.
Asegúrate de configurar el acceso de Google con el ID de cliente de Google generado para tu proyecto de Firebase. Puedes encontrar el ID de cliente de Google del proyecto en la página Credenciales de Developers Console del proyecto. Luego realiza el reemplazo:
<!-- **********************************************
* TODO(DEVELOPER): Use your Client ID below. *
********************************************** -->
<meta name="google-signin-client_id" content="YOUR_CLIENT_ID">
<meta name="google-signin-cookiepolicy" content="single_host_origin">
<meta name="google-signin-scope" content="profile email">
Después de integrar el Acceso con Google, tu página web tendrá un botón de Acceso con Google configurado con una función callback, como en el siguiente ejemplo:
En la devolución de llamada de resultado del botón de acceso, reemplaza el token de ID de la respuesta de autenticación de Google por una credencial de Firebase y accede a Firebase:
function onSignIn(googleUser) {
console.log('Google Auth Response', googleUser);
// We need to register an Observer on Firebase Auth to make sure auth is initialized.
var unsubscribe = firebase.auth().onAuthStateChanged((firebaseUser) => {
unsubscribe();
// Check if we are already signed-in Firebase with the correct user.
if (!isUserEqual(googleUser, firebaseUser)) {
// Build Firebase credential with the Google ID token.
var credential = firebase.auth.GoogleAuthProvider.credential(
googleUser.getAuthResponse().id_token);
// Sign in with credential from the Google user.
firebase.auth().signInWithCredential(credential).catch((error) => {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// The email of the user's account used.
var email = error.email;
// The firebase.auth.AuthCredential type that was used.
var credential = error.credential;
// ...
});
} else {
console.log('User already signed-in Firebase.');
}
});
}
También debes verificar que el usuario de Google no haya accedido previamente a Firebase, para evitar una nueva autorización innecesaria:
function isUserEqual(googleUser, firebaseUser) {
if (firebaseUser) {
var providerData = firebaseUser.providerData;
for (var i = 0; i < providerData.length; i++) {
if (providerData[i].providerId === firebase.auth.GoogleAuthProvider.PROVIDER_ID &&
providerData[i].uid === googleUser.getBasicProfile().getId()) {
// We don't need to reauth the Firebase connection.
return true;
}
}
}
return false;
}
Avanzado: Autenticación con Firebase en Node.js
Para realizar una autenticación con Firebase en una aplicación de Node.js:
Inicia la sesión del usuario con su cuenta de Google y obtén su token de ID de Google. Hay varias maneras de hacer esto. Por ejemplo:
Si tu app tiene un frontend de navegación, usa el Acceso con Google como se describió en la sección para manejar el flujo de acceso de manera manual. Obtén el token de ID de Google de la respuesta de la autenticación:
var id_token = googleUser.getAuthResponse().id_token
Después de obtener el token de ID de Google del usuario, úsalo para crear un objeto de credencial y haz que el usuario acceda con él:
// Build Firebase credential with the Google ID token.
var credential = firebase.auth.GoogleAuthProvider.credential(id_token);
// Sign in with credential from the Google user.
firebase.auth().signInWithCredential(credential).catch(function(error) {
// Handle Errors here.
var errorCode = error.code;
var errorMessage = error.message;
// The email of the user's account used.
var email = error.email;
// The firebase.auth.AuthCredential type that was used.
var credential = error.credential;
// ...
});
Autentica con Firebase en una extensión de Chrome
Si compilas una app de extensión de Chrome, debes agregar el ID de la extensión de Chrome:
En la sección Aut., abre la página Método de acceso.
Agrega un URI como el siguiente a la lista de dominios autorizados:
chrome-extension://CHROME_EXTENSION_ID
Solo las operaciones con ventanas emergentes (signInWithPopup y linkWithPopup) están disponibles para las extensiones de Chrome, ya que estas no pueden usar redireccionamientos HTTP. Deberías llamar a estos métodos desde una secuencia de comandos en segundo plano en lugar de una ventana emergente de acción en el navegador, ya que la ventana emergente de autenticación cancela la de acción del navegador.
En el archivo de manifiesto de tu extensión de Chrome, asegúrate de agregar la URL https://apis.google.com a la lista de lista de anunciantes permitidos content_security_policy.
Personaliza el dominio de redireccionamiento para el acceso con Google
Cuando crees un proyecto, Firebase le otorgará un subdominio único: https://my-app-12345.firebaseapp.com.
También se usará como mecanismo de redireccionamiento para acceder a OAuth. Todos los proveedores de OAuth admitidos deberían permitir el dominio. Sin embargo, es probable que los usuarios vean ese dominio cuando accedan a Google antes de que se los redireccione a la aplicación; p. ej.: Continúa a: https://my-app-12345.firebaseapp.com.
Para que la URL del mensaje muestre un dominio personalizado: continúa a: https://auth.custom.domain.com
Crea un registro CNAME para el dominio personalizado que dirija al subdominio del proyecto en firebaseapp.com:
Agrega tu dominio personalizado a la lista de dominios autorizados en Firebase console: auth.custom.domain.com.
En la consola para desarrolladores de Google o en la página de configuración de OAuth, incluye en la lista blanca la URL de la página de redireccionamiento, a la que se podrá acceder en tu dominio personalizado: https://auth.custom.domain.com/__/auth/handler.
Cuando inicialices la biblioteca JavaScript, especifica el dominio personalizado en el campo authDomain:
Cuando un usuario accede por primera vez, se crea una cuenta de usuario nueva y se la vincula con las credenciales (el nombre de usuario y la contraseña, el número de teléfono o la información del proveedor de autenticación) que el usuario utilizó para acceder. Esta cuenta nueva se almacena como parte de tu proyecto de Firebase y se puede usar para identificar a un usuario en todas las apps del proyecto, sin importar cómo acceda.
En tus apps, para conocer el estado de autenticación del usuario, te recomendamos configurar un observador en el objeto Auth. Puedes obtener la información básica de perfil del usuario a partir del objeto User. Consulta Administra usuarios en Firebase.
En tus reglas de seguridad de Firebase Realtime Database y Cloud Storage, puedes obtener el ID del usuario único que accedió a partir de la variable auth y usarlo para controlar a qué datos podrá acceder.