Как программно настроить поставщиков идентификационной информации OAuth для Firebase Authentication

Вы можете использовать Google Cloud Identity Platform REST API, чтобы программно управлять конфигурацией поставщика идентификационной информации OAuth (IdP) проекта Firebase. С помощью этого 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, отправьте запрос POST с новой конфигурацией в конечную точку projects.defaultSupportedIdpConfigs.

Вам нужно будет указать идентификатор поставщика услуг идентификации, а также идентификатор и секретный код клиента, которые обычно можно получить на сайте разработчика поставщика. Ниже перечислены поставщики идентификационной информации, поддерживаемые Firebase, и их идентификаторы:

Поставщик 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'
}

Если вы попытаетесь настроить поставщика идентификационной информации, который уже настроен для вашего проекта, вызов вернет ошибку HTTP 409. В этом случае вы можете изменить конфигурацию, как описано ниже.

Как изменить конфигурацию поставщика идентификационной информации OAuth

Чтобы включить или отключить поставщика идентификационной информации OAuth или обновить конфигурацию клиента проекта, сначала получите текущую конфигурацию поставщика, отправив запрос GET к конечной точке projects.defaultSupportedIdpConfigs. Затем внесите нужные изменения в конфигурацию и отправьте запрос PATCH с новой конфигурацией в конечную точку 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. Вместо этого настройте нового поставщика идентификационной информации, как описано в предыдущем разделе.