Firebase Authentication 用に OAuth ID プロバイダをプログラムで構成する

Google Cloud Identity Platform REST API を使用して、Firebase プロジェクトの OAuth ID プロバイダ(IdP)の構成をプログラムで管理できます。この API を使用すると、サポートする ID プロバイダを設定し、プロジェクトの現在の OAuth 構成を更新、有効化、無効化できます。

承認の取得

REST API を呼び出す前に、Firebase プロジェクトへの編集者のアクセス権を付与する OAuth 2.0 アクセス トークンが必要です。例: 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 ID プロバイダの構成を追加する

新しい OAuth ID プロバイダ(IdP)の構成を追加するには、新しい構成を projects.defaultSupportedIdpConfigs エンドポイントに POST します。

ID プロバイダの ID と、通常はプロバイダのデベロッパー サイトから取得するクライアント ID とクライアント シークレットを指定する必要があります。Firebase がサポートする ID プロバイダとその ID は次のとおりです。

プロバイダ IdP ID
Apple apple.com
Apple Game Center gc.apple.com
Facebook facebook.com
GitHub github.com
Google google.com
Google Play ゲーム playgames.google.com
LinkedIn linkedin.com
Microsoft microsoft.com
Twitter twitter.com
Yahoo 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'
}

プロジェクトに対してすでに設定されている ID プロバイダを設定しようとすると、呼び出しは HTTP エラー 409 を返します。この場合は、以下のように設定を更新できます。

OAuth ID プロバイダの構成を更新する

OAuth ID プロバイダを有効または無効にしたり、またはプロジェクトのクライアント構成を更新したりするには、まず 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);

プロジェクトに対して構成したことがない ID プロバイダの構成を更新しようとすると、呼び出しは HTTP エラー 404 を返します。代わりに、前のセクションの説明に沿って新しい ID プロバイダを設定します。