Permitir que los usuarios accedan con GitHub

En este documento se muestra cómo usar Identity Platform para que los usuarios accedan con GitHub.

Antes de comenzar

En este instructivo, se supone que ya habilitaste Identity Platform y que tienes una aplicación web básica escrita con HTML y JavaScript. Consulta la Guía de inicio rápido para aprender a hacer esto.

Configura GitHub como proveedor

Para configurar GitHub como proveedor de identidad, haz lo siguiente:

  1. Ve a la página Proveedores de identidad en la consola de Google Cloud.

    Ir a la página Proveedores de identidad

  2. Haz clic en Agregar un proveedor.

  3. Selecciona GitHub de la lista.

  4. Ingresa el ID de cliente de GitHub y el secreto de cliente. Si aún no tienes un ID y un secreto, puedes obtener uno de la página Aplicaciones de GitHub.

  5. Configura el URI que aparece en Configurar GitHub como un URI de redireccionamiento de OAuth válido para tu app de GitHub. Si configuraste un dominio personalizado en Identity Platform, actualiza el URI de redireccionamiento en la configuración de tu app de GitHub para usar el dominio personalizado en lugar del dominio predeterminado. Por ejemplo, cambia https://myproject.firebaseapp.com/__/auth/handler a https://auth.myownpersonaldomain.com/__/auth/handler.

  6. Para registrar los dominios de tu app, haz clic en Agregar dominio en Dominios autorizados. Para fines de desarrollo, localhost ya está habilitado de forma predeterminada.

  7. En Configura tu aplicación, haz clic en Detalles de la configuración. Copia el fragmento en el código de tu app para inicializar el SDK de cliente de Identity Platform.

  8. Haz clic en Guardar.

Acceso de los usuarios con el SDK de cliente

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

    Web versión 9

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

    Web versión 8

    var provider = new firebase.auth.GithubAuthProvider();
  1. Opcional: Agrega permisos de OAuth. Los permisos especifican qué datos solicitas de GitHub. Los datos más sensibles pueden requerir permisos específicos. Consulta la documentación del proveedor para determinar los permisos que necesita tu app.

    Web versión 9

    provider.addScope('repo');

    Web versión 8

    provider.addScope('repo');
  1. Opcional: Localiza el flujo de autenticación. Puedes especificar un lenguaje o usar el lenguaje predeterminado del dispositivo:

    Web versión 9

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

    Web versión 8

    firebase.auth().languageCode = 'it';
    // To apply the default browser preference instead of explicitly setting it.
    // firebase.auth().useDeviceLanguage();
  2. Opcional: Especifica parámetros personalizados de OAuth adicionales. Estos son específicos de GitHub y, por lo general, se usan para personalizar la experiencia de autenticación. No puedes pasar parámetros reservados por OAuth o Identity Platform.

Web versión 9

provider.setCustomParameters({
  'allow_signup': 'false'
});

Web versión 8

provider.setCustomParameters({
  'allow_signup': 'false'
});
  1. Usa el objeto del proveedor de GitHub para permitir que el usuario acceda. Puedes abrir una ventana emergente o redireccionar la página actual. El redireccionamiento es más sencillo para los usuarios de dispositivos móviles.

    Para mostrar una ventana emergente, llama a signInWithPopup():

    Web versión 9

    import { getAuth, signInWithPopup, GithubAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    signInWithPopup(auth, provider)
      .then((result) => {
        // This gives you a GitHub Access Token. You can use it to access the GitHub API.
        const credential = GithubAuthProvider.credentialFromResult(result);
        const token = credential.accessToken;
    
        // 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 = GithubAuthProvider.credentialFromError(error);
        // ...
      });

    Web versión 8

    firebase
      .auth()
      .signInWithPopup(provider)
      .then((result) => {
        /** @type {firebase.auth.OAuthCredential} */
        var credential = result.credential;
    
        // This gives you a GitHub Access Token. You can use it to access the GitHub API.
        var token = credential.accessToken;
    
        // 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;
        // ...
      });

    Para redireccionar la página, primero llama a signInWithRedirect().

    Sigue las prácticas recomendadas cuando uses signInWithRedirect, linkWithRedirect o reauthenticateWithRedirect.

    Web versión 9

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

    Web versión 8

    firebase.auth().signInWithRedirect(provider);

    Luego, llama a getRedirectResult() cuando tu página cargue para recuperar el token de GitHub:

    Web versión 9

    import { getAuth, getRedirectResult, GithubAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    getRedirectResult(auth)
      .then((result) => {
        const credential = GithubAuthProvider.credentialFromResult(result);
        if (credential) {
          // This gives you a GitHub Access Token. You can use it to access the GitHub API.
          const token = credential.accessToken;
          // ...
        }
    
        // 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 = GithubAuthProvider.credentialFromError(error);
        // ...
      });

    Web versión 8

    firebase.auth()
      .getRedirectResult()
      .then((result) => {
        if (result.credential) {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
    
          // This gives you a GitHub Access Token. You can use it to access the GitHub API.
          var token = credential.accessToken;
          // ...
        }
    
        // 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;
        // ...
      });

Una vez que tengas un token de acceso, puedes usarlo para llamar a la API de GitHub. Por ejemplo:

REST

curl -H "Authorization: Bearer [TOKEN]" https://api.github.com/gists/starred

Permite que los usuarios accedan de forma manual

Si no deseas usar el SDK de cliente, también puedes manejar el flujo de acceso manualmente:

  1. Para integrar la autenticación de GitHub en tu app, sigue los pasos de su documentación para desarrolladores.

  2. Permite que el usuario acceda a GitHub mediante el flujo que implementaste en el paso anterior.

  3. Intercambia el token que recibes de GitHub por una credencial de Identity Platform:

    Web versión 9

    import { GithubAuthProvider } from "firebase/auth";
    
    const credential = GithubAuthProvider.credential(token);

    Web versión 8

    var credential = firebase.auth.GithubAuthProvider.credential(token);
  4. Usa la credencial para que el usuario acceda con Identity Platform:

    Web versión 9

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

    Web versión 8

    // Sign in with the credential from the user.
    firebase.auth()
      .signInWithCredential(credential)
      .then((result) => {
        // Signed in
        // ...
      })
      .catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
        // The email of the user's account used.
        const email = error.email;
        // ...
      });

¿Qué sigue?