Autentica con Twitter en JavaScript

Puedes permitir que tus usuarios se autentiquen con Firebase mediante sus cuentas de Twitter si integras la autenticación de Twitter en tu app. Puedes hacerlo si usas el SDK de Firebase para ejecutar el flujo de acceso o si ejecutas el flujo de OAuth de Twitter de forma manual y pasas el token de acceso y el secreto resultantes a Firebase.

Antes de comenzar

  1. Agrega Firebase al proyecto de JavaScript.
  2. En Firebase console, abre la sección Auth.
  3. En la pestaña Método de acceso, habilita el proveedor Twitter.
  4. Agrega a la configuración del proveedor la clave de API y el secreto de API de la consola para desarrolladores del proveedor:
    1. Registra tu app como una aplicación de desarrollador en Twitter y obtén la clave de API y el secreto de API de OAuth correspondientes.
    2. Asegúrate de que tu URI de redireccionamiento de OAuth de Firebase (p. ej., my-app-12345.firebaseapp.com/__/auth/handler) esté configurado como URL de devolución de llamada de autorización en la página de configuración de tu app en Twitter.
  5. 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 Twitter 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:

  1. Crea una instancia del objeto de proveedor de Twitter:

    API modular web

    import { TwitterAuthProvider } from "firebase/auth";
    
    const provider = new TwitterAuthProvider();

    API con espacio de nombres web

    var provider = new firebase.auth.TwitterAuthProvider();
  2. Opcional: Para ajustar el flujo de 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:

    API modular web

    import { getAuth } from "firebase/auth";
    
    const auth = getAuth();
    auth.languageCode = 'it';
    // To apply the default browser preference instead of explicitly setting it.
    // auth.useDeviceLanguage();

    API con espacio de nombres web

    firebase.auth().languageCode = 'it';
    // To apply the default browser preference instead of explicitly setting it.
    // firebase.auth().useDeviceLanguage();
  3. 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:

    API modular web

    provider.setCustomParameters({
      'lang': 'es'
    });

    API con espacio de nombres web

    provider.setCustomParameters({
      'lang': 'es'
    });
    No se permiten los parámetros de OAuth necesarios reservados y se omitirán. Consulta la referencia del proveedor de autenticación para obtener más información.
  4. Autentica con Firebase y con el objeto de proveedor de Twitter. Para que tus usuarios accedan con sus cuentas de Twitter, puedes abrir una ventana emergente o redireccionarlos 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:

      API modular web

      import { getAuth, signInWithPopup, TwitterAuthProvider } from "firebase/auth";
      
      const auth = getAuth();
      signInWithPopup(auth, provider)
        .then((result) => {
          // This gives you a the Twitter OAuth 1.0 Access Token and Secret.
          // You can use these server side with your app's credentials to access the Twitter API.
          const credential = TwitterAuthProvider.credentialFromResult(result);
          const token = credential.accessToken;
          const secret = credential.secret;
      
          // The signed-in user info.
          const user = result.user;
          // IdP data available using getAdditionalUserInfo(result)
          // ...
        }).catch((error) => {
          // Handle Errors here.
          const errorCode = error.code;
          const errorMessage = error.message;
          // The email of the user's account used.
          const email = error.customData.email;
          // The AuthCredential type that was used.
          const credential = TwitterAuthProvider.credentialFromError(error);
          // ...
        });

      API con espacio de nombres web

      firebase
        .auth()
        .signInWithPopup(provider)
        .then((result) => {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
      
          // This gives you a the Twitter OAuth 1.0 Access Token and Secret.
          // You can use these server side with your app's credentials to access the Twitter API.
          var token = credential.accessToken;
          var secret = credential.secret;
      
          // The signed-in user info.
          var user = result.user;
          // IdP data available in result.additionalUserInfo.profile.
            // ...
        }).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 Twitter que se puede usar para recuperar datos adicionales con las API de Twitter.

      Aquí también puedes detectar y resolver errores. Para obtener una lista de códigos de error, consulta los documentos de referencia de autenticación.

    • Para acceder mediante el redireccionamiento a la página de acceso, llama a signInWithRedirect: Sigue las prácticas recomendadas cuando uses “signInWithRedirect”.

      API modular web

      import { getAuth, signInWithRedirect } from "firebase/auth";
      
      const auth = getAuth();
      signInWithRedirect(auth, provider);

      API con espacio de nombres web

      firebase.auth().signInWithRedirect(provider);
      Luego, para recuperar el token de OAuth del proveedor de Twitter, puedes llamar a getRedirectResult cuando cargue tu página:

      API modular web

      import { getAuth, getRedirectResult, TwitterAuthProvider } from "firebase/auth";
      
      const auth = getAuth();
      getRedirectResult(auth)
        .then((result) => {
          // This gives you a the Twitter OAuth 1.0 Access Token and Secret.
          // You can use these server side with your app's credentials to access the Twitter API.
          const credential = TwitterAuthProvider.credentialFromResult(result);
          const token = credential.accessToken;
          const secret = credential.secret;
          // ...
      
          // The signed-in user info.
          const user = result.user;
          // IdP data available using getAdditionalUserInfo(result)
          // ...
        }).catch((error) => {
          // Handle Errors here.
          const errorCode = error.code;
          const errorMessage = error.message;
          // The email of the user's account used.
          const email = error.customData.email;
          // The AuthCredential type that was used.
          const credential = TwitterAuthProvider.credentialFromError(error);
          // ...
        });

      API con espacio de nombres web

      firebase.auth()
        .getRedirectResult()
        .then((result) => {
          if (result.credential) {
            /** @type {firebase.auth.OAuthCredential} */
            var credential = result.credential;
      
            // This gives you a the Twitter OAuth 1.0 Access Token and Secret.
            // You can use these server side with your app's credentials to access the Twitter API.
            var token = credential.accessToken;
            var secret = credential.secret;
            // ...
          }
      
          // The signed-in user info.
          var user = result.user;
          // IdP data available in result.additionalUserInfo.profile.
            // ...
        }).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;
          // ...
        });
      Aquí también puedes detectar y resolver errores. Para obtener una lista de códigos de error, consulta los documentos de referencia de autenticación.

Maneja el flujo de acceso de manera manual

También puedes autenticar con Firebase mediante una cuenta de Twitter. Para esto, debes llamar a los extremos de OAuth de Twitter a fin de administrar el flujo de acceso:

  1. Sigue las indicaciones que aparecen en la documentación para desarrolladores a fin de integrar la autenticación de Twitter en la app. Al final del flujo de acceso de Twitter, recibirás un secreto y un token de acceso de OAuth.
  2. Si necesitas acceder en una aplicación de Node.js, envía el token de acceso y el secreto de OAuth a la app de Node.js.
  3. Una vez que un usuario acceda de forma correcta con Twitter, intercambia el token de acceso de OAuth y el secreto de OAuth por una credencial de Firebase:
    var credential = firebase.auth.TwitterAuthProvider.credential(token, secret);
    
  4. Usa la credencial de Firebase para autenticar con Firebase:

    API modular web

    import { getAuth, signInWithCredential, FacebookAuthProvider } from "firebase/auth";
    
    // Sign in with the credential from the Facebook user.
    const auth = getAuth();
    signInWithCredential(auth, credential)
      .then((result) => {
        // Signed in 
        const credential = FacebookAuthProvider.credentialFromResult(result);
      })
      .catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
        // The email of the user's account used.
        const email = error.customData.email;
        // The AuthCredential type that was used.
        const credential = FacebookAuthProvider.credentialFromError(error);
        // ...
      });

    API con espacio de nombres web

    // Sign in with the credential from the Facebook user.
    firebase.auth().signInWithCredential(credential)
      .then((result) => {
        // Signed in       
        var credential = result.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;
        // ...
      });

Autentica con Firebase en una extensión de Chrome

Si desarrollas una app de extensión de Chrome, debes agregar el ID de la extensión de Chrome:

  1. Abre tu proyecto en Firebase console.
  2. En la sección Authentication, abre la página Sign-in method.
  3. Agrega un URI como el siguiente a la lista de dominios autorizados:
    chrome-extension://CHROME_EXTENSION_ID

Solo las operaciones con ventanas emergentes (signInWithPopup, linkWithPopup y reauthenticateWithPopup) 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 página de 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. Los métodos de ventana emergente solo se pueden usar en extensiones con Manifest V2. El Manifest V3 más reciente solo permite secuencias de comandos en segundo plano en forma de service workers, que no pueden realizar operaciones de ventana emergente.

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 entidades permitidas content_security_policy.

Próximos pasos

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. Luego podrás obtener la información de perfil básica del usuario a partir del objeto User. Consulta Administra usuarios en Firebase.

  • En tus reglas de seguridad de Firebase Realtime Database y Cloud Storage, a partir de la variable auth, puedes obtener el ID del usuario único que accedió y usarlo para controlar a qué datos podrá acceder.

Para permitir que los usuarios accedan a la app con varios proveedores de autenticación, puedes vincular las credenciales de estos proveedores con una cuenta de usuario existente.

Para hacer que un usuario salga de la sesión, llama a signOut de la siguiente manera:

API modular web

import { getAuth, signOut } from "firebase/auth";

const auth = getAuth();
signOut(auth).then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});

API con espacio de nombres web

firebase.auth().signOut().then(() => {
  // Sign-out successful.
}).catch((error) => {
  // An error happened.
});