Configura de manera programática los proveedores de identidad de OAuth para Firebase Authentication

Puedes usar la API de REST de Google Cloud Identity Platform para administrar de manera programática la configuración de proveedores de identidad (IdP) de OAuth de un proyecto de Firebase. Con esta API, puedes configurar los proveedores de identidad que deseas admitir, además de habilitar, inhabilitar y actualizar la configuración actual de OAuth de tu proyecto.

Obtén la autorización

Antes de llamar a la API de REST, necesitas un token de acceso de OAuth 2.0 que otorgue acceso de Editor al proyecto de Firebase. Por ejemplo, para obtener un token de acceso con una cuenta de servicio en Node.js, usa lo siguiente:

const googleAuth = require('google-auth-library');
const SCOPES = ['https://www.googleapis.com/auth/cloud-platform'];

async function getAccessToken() {
    const serviceAccount = require('/path/to/service_account_key.json');
    const jwtClient = new googleAuth.JWT(
        serviceAccount.client_email,
        null,
        serviceAccount.private_key,
        SCOPES,
        null
    );
    return jwtClient.authorize().then((tokens) => tokens.access_token);
}

Agrega una nueva configuración del proveedor de identidad de OAuth

A fin de agregar una nueva configuración del proveedor de identidad (IdP) de OAuth, usa POST para pasar la nueva configuración al extremo projects.defaultSupportedIdpConfigs.

Deberás especificar el ID del proveedor de identidad, tu ID de cliente y el secreto de cliente, que normalmente se obtiene del sitio para desarrolladores del proveedor. Estos son los proveedores de identidad que admite Firebase y sus ID:

Proveedor ID de IdP
Apple apple.com
Apple Game Center gc.apple.com
Facebook facebook.com
GitHub github.com
Google google.com
Google Play Juegos playgames.google.com
LinkedIn linkedin.com
Microsoft microsoft.com
Twitter twitter.com
Yahoo yahoo.com

Por ejemplo, con Node.js:

const fetch = require('node-fetch');
const GCIP_API_BASE = 'https://identitytoolkit.googleapis.com/v2';

async function addIdpConfig(projectId, accessToken, idpId, clientId, clientSecret) {
    const uri = `${GCIP_API_BASE}/projects/${projectId}/defaultSupportedIdpConfigs?idpId=${idpId}`;
    const options = {
        method: 'POST',
        headers: {
            'Authorization': `Bearer ${accessToken}`
        },
        body: JSON.stringify({
            name: `projects/${projectId}/defaultSupportedIdpConfigs/${idpId}`,
            enabled: true,
            clientId: clientId,
            clientSecret: clientSecret,
        }),
    };
    return fetch(uri, options).then((response) => {
        if (response.ok) {
            return response.json();
        } else if (response.status == 409) {
            throw new Error('IdP configuration already exists. Update it instead.');
        } else {
            throw new Error('Server error.');
        }
    });
}

(async () => {
    const projectId = 'your-firebase-project-id';
    const accessToken = await getAccessToken();
    const idpId = 'facebook.com';
    const clientId = 'your-facebook-client-id';
    const clientSecret = 'your-facebook-client-secret';
    try {
        await addIdpConfig(projectId, accessToken, idpId, clientId, clientSecret);
    } catch (err) {
        console.error(err.message);
    }
})().catch(console.error);

Si la llamada se ejecuta correctamente, muestra la configuración recién creada. Por ejemplo:

{
  name: 'projects/your-numerical-project-id/defaultSupportedIdpConfigs/facebook.com',
  enabled: true,
  clientId: 'your-facebook-client-id',
  clientSecret: 'your-facebook-client-secret'
}

Si intentas configurar un proveedor de identidad que ya se configuró para tu proyecto, la llamada muestra el error HTTP 409. En este caso puedes actualizar la configuración, como se describe a continuación.

Actualiza una configuración de proveedor de identidad de OAuth

Para habilitar o inhabilitar un proveedor de identidad de OAuth, o actualizar la configuración de cliente del proyecto, primero realiza una solicitud GET al extremo projects.defaultSupportedIdpConfigs para obtener la configuración actual del proveedor. Luego, realiza los cambios que desees en la configuración y usa PATCH para aplicarlos en el extremo projects.defaultSupportedIdpConfigs.

Por ejemplo, con Node.js:

async function getIdpCfg(projectId, accessToken, idpId) {
    const uri = `${GCIP_API_BASE}/projects/${projectId}/defaultSupportedIdpConfigs/${idpId}`;
    const options = {
        method: 'GET',
        headers: {
            'Authorization': `Bearer ${accessToken}`
        },
    };
    return fetch(uri, options).then((response) => {
        if (response.ok) {
            return response.json();
        } else if (response.status == 404) {
            throw new Error('IdP configuration not found. First add the IdP'
                            + ' configuration to your project.');
        } else {
            throw new Error('Server error.');
        }
    });
}

async function updateIdpConfig(accessToken, idpCfg) {
    const uri = `${GCIP_API_BASE}/${idpCfg.name}`;
    const options = {
        method: 'PATCH',
        headers: {
            'Authorization': `Bearer ${accessToken}`
        },
        body: JSON.stringify(idpCfg),
    };
    return fetch(uri, options).then((response) => {
        if (response.ok) {
            return response.json();
        } else if (response.status == 404) {
            throw new Error('IdP configuration not found. First add the IdP'
                            + ' configuration to your project.');
        } else {
            throw new Error('Server error.');
        }
    });
}

(async () => {
    const projectId = 'your-firebase-project-id';
    const accessToken = await getAccessToken();
    const idpId = 'facebook.com';
    try {
        // Get the IdP's current configuration.
        const idpCfg = await getIdpCfg(projectId, accessToken, idpId);

        // Update the configuration. (For example, disable the IdP.)
        idpCfg.enabled = false;
        await updateIdpConfig(accessToken, idpCfg);
    } catch (err) {
        console.error(err.message);
    }
})().catch(console.error);

Si intentas actualizar la configuración de un proveedor de identidad que nunca configuraste para tu proyecto, las llamadas mostrarán el error HTTP 404. En su lugar, configura un proveedor de identidad nuevo como se muestra en la sección anterior.