Configurar programaticamente provedores de identidade OAuth para Firebase Authentication

É possível usar a API REST do Google Cloud Identity Platform para gerenciar programaticamente a configuração do provedor de identidade (IdP) OAuth de um projeto do Firebase. Com esta API, você pode configurar os provedores de identidade que deseja oferecer suporte e atualizar, habilitar e desabilitar as configurações OAuth atuais do seu projeto.

Obtenha autorização

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

Adicione uma nova configuração de provedor de identidade OAuth

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

Você precisará especificar o ID do provedor de identidade e o ID do cliente e o segredo do cliente, que normalmente são obtidos no site do desenvolvedor do provedor. Aqui estão os provedores de identidade compatíveis com o Firebase e seus IDs:

Fornecedor ID do IdP
Maçã apple.com
Centro de jogos da Apple gc.apple.com
Facebook facebook.com
GitHub github.com
Google google.com
Jogos do Google Play 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. Por 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á tenha sido configurado para o seu projeto, a chamada retornará o erro HTTP 409. Nessa situação, você poderá atualizar a configuração, conforme descrito abaixo.

Atualizar uma configuração de provedor de identidade OAuth

Para ativar ou desativar um provedor de identidade OAuth ou atualizar a configuração do cliente do seu projeto, primeiro obtenha 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 PATCH a nova configuração no 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 configurou 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 .