Configurar mediante programación proveedores de identidad OAuth para Firebase Authentication

Puedes usar la API REST de Google Cloud Identity Platform para administrar mediante programación la configuración del proveedor de identidad (IdP) OAuth de un proyecto de Firebase. Con esta API, puede configurar los proveedores de identidad que desea admitir y actualizar, habilitar y deshabilitar las configuraciones OAuth actuales de su proyecto.

Obtener autorización

Antes de poder llamar a la API REST, necesita un token de acceso OAuth 2.0 que otorgue acceso de editor a su proyecto de Firebase. Por ejemplo, para obtener un token de acceso mediante una cuenta de servicio en Node.js:

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);
}

Agregar una nueva configuración de proveedor de identidad OAuth

Para agregar una nueva configuración de proveedor de identidad (IdP) de OAuth, PUBLICAR la nueva configuración en el punto final projects.defaultSupportedIdpConfigs .

Deberá especificar el ID del proveedor de identidad y su ID de cliente y secreto de cliente, que normalmente obtiene del sitio de desarrollador del proveedor. Estos son los proveedores de identidad que admite Firebase y sus ID:

Proveedor ID del proveedor de identidad
Manzana apple.com
Centro de juegos de Apple gc.apple.com
Facebook facebook.com
GitHub github.com
Google google.com
Juegos de Google Play playgames.google.com
LinkedIn linkedin.com
microsoft microsoft.com
Gorjeo twitter.com
yahoo yahoo.com

Por ejemplo, usando 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 tiene éxito, devuelve 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 intenta configurar un proveedor de identidad que ya se ha configurado para su proyecto, la llamada devuelve el error HTTP 409. En esta situación, puede actualizar la configuración, como se describe a continuación.

Actualizar una configuración de proveedor de identidad OAuth

Para habilitar o deshabilitar un proveedor de identidad OAuth, o actualizar la configuración del cliente de su proyecto, primero obtenga la configuración actual del proveedor realizando una solicitud GET al punto final projects.defaultSupportedIdpConfigs . Luego, realice los cambios que desee en la configuración y PATCH la nueva configuración en el punto final projects.defaultSupportedIdpConfigs .

Por ejemplo, usando 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 intenta actualizar la configuración de un proveedor de identidad que nunca configuró para su proyecto, las llamadas devolverán el error HTTP 404. En su lugar, configure un nuevo proveedor de identidad como se muestra en la sección anterior .