Программная настройка поставщиков удостоверений OAuth для аутентификации Firebase.

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

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

Поставщик Идентификатор поставщика удостоверений
Яблоко apple.com
Apple, игровой центр gc.apple.com
Фейсбук facebook.com
GitHub github.com
Google google.com
Google Play игры playgames.google.com
LinkedIn linkedin.com
Майкрософт microsoft.com
Твиттер 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 . Затем внесите необходимые изменения в конфигурацию и ИСПРАВЬТЕ новую конфигурацию для конечной точки 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. Вместо этого настройте нового поставщика удостоверений, как показано в предыдущем разделе .