Configurar de maneira programática os provedores de identidade OAuth para o Firebase Authentication

Use a API REST do Google Cloud Identity Platform para gerenciar programaticamente a configuração do provedor de identidade OAuth (IdP) de um projeto do Firebase. Com essa API, é possível configurar os provedores de identidade aos quais você quer oferecer suporte e atualizar, ativar e desativar as configurações atuais do OAuth do projeto.

Receber autorização

Antes de chamar a API REST, você precisa de um token de acesso do OAuth 2.0 que conceda acesso de editor ao seu projeto do Firebase. Por exemplo, para receber um token de acesso usando uma conta de serviço no 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);
}

Adicionar uma nova configuração do provedor de identidade OAuth

Para adicionar uma nova configuração do provedor de identidade OAuth (IdP), POSTE a nova configuração no endpoint projects.defaultSupportedIdpConfigs.

Você precisará especificar o ID do provedor de identidade, bem como o ID do cliente e a chave secreta do cliente, que normalmente são obtidos no site do desenvolvedor do provedor. Veja os provedores de identidade compatíveis com o Firebase e os respectivos códigos:

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

Por exemplo, 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);

Se a chamada for bem-sucedida, ela retornará a configuração recém-criada. Exemplo:

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

Se você tentar configurar um provedor de identidade que já foi configurado para seu projeto, a chamada retornará o erro HTTP 409. Nessa situação, você pode atualizar a configuração, conforme descrito abaixo.

Atualizar uma configuração do provedor de identidade OAuth

Para ativar ou desativar um provedor de identidade OAuth ou atualizar a configuração do cliente do projeto, primeiro receba a configuração atual do provedor fazendo uma solicitação GET para o endpoint projects.defaultSupportedIdpConfigs. Em seguida, faça as alterações desejadas na configuração e CORRIJA a nova configuração para o endpoint projects.defaultSupportedIdpConfigs.

Por exemplo, 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);

Se você tentar atualizar a configuração de um provedor de identidade que nunca foi configurado para seu projeto, as chamadas retornarão o erro HTTP 404. Em vez disso, configure um novo provedor de identidade, conforme mostrado na seção anterior.