以编程方式为 Firebase Authentication 配置 OAuth 身份提供商

您可以使用 Google Cloud Identity Platform REST API 以编程方式管理 Firebase 项目的 OAuth 身份提供商 (IdP) 配置。借助此 API,您可以配置想要支持的身份提供商,以及更新、启用和停用项目的当前 OAuth 配置。

获取授权

在调用 REST API 之前,您需要一个 OAuth 2.0 访问令牌,以授予对您的 Firebase 项目的编辑者访问权限。例如,要在 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);
}

添加新的 OAuth 身份提供商配置

要添加新的 OAuth 身份提供商 (IdP) 配置,请使用 POST 方法将将新的配置发布到 projects.defaultSupportedIdpConfigs 端点。

您需要指定身份提供商的 ID 以及您的客户端 ID 和客户端密钥(通常从提供商的开发者网站获取)。以下是 Firebase 支持的身份提供商及其 ID:

提供商 身份提供商 ID
Apple apple.com
Apple 游戏中心 gc.apple.com
Facebook facebook.com
GitHub github.com
Google google.com
Google Play 游戏 playgames.google.com
LinkedIn linkedin.com
微软 microsoft.com
Twitter twitter.com
雅虎 yahoo.com

例如,使用 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);

如果调用成功,则返回新创建的配置。例如:

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

如果您尝试为项目配置已配置过的身份提供商,则该调用将返回 HTTP 错误 409。在这种情况下,您可以改而更新配置,如下所述。

更新 OAuth 身份提供商配置

要启用或停用 OAuth 身份提供商,或更新项目的客户端配置,请先向 projects.defaultSupportedIdpConfigs 端点发出 GET 请求,以获取提供商的当前配置。 然后,根据需要对配置进行更改,并将新配置修补到 projects.defaultSupportedIdpConfigs 端点。

例如,使用 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);

如果尝试更新从未为项目配置过的某个身份提供商的配置,则调用将返回 HTTP 错误 404。请转而按照上一部分中的说明配置新的身份提供商。