Mengonfigurasi penyedia identitas OAuth secara terprogram untuk Firebase Authentication

Anda dapat menggunakan Google Cloud Identity Platform REST API untuk mengelola konfigurasi penyedia identitas OAuth (IdP) project Firebase secara terprogram. Dengan API ini, Anda dapat mengonfigurasi penyedia identitas yang ingin Anda dukung, serta memperbarui, mengaktifkan, dan menonaktifkan konfigurasi OAuth project Anda saat ini.

Mendapatkan otorisasi

Sebelum dapat memanggil REST API, Anda memerlukan token akses OAuth 2.0 yang memberikan akses Editor ke project Firebase Anda. Misalnya, untuk mendapatkan token akses menggunakan akun layanan di 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);
}

Menambahkan konfigurasi penyedia identitas OAuth baru

Untuk menambahkan konfigurasi penyedia identitas (IdP) OAuth baru, POSTING konfigurasi baru ke endpoint projects.defaultSupportedIdpConfigs.

Anda harus menentukan ID penyedia identitas dan ID klien serta rahasia klien, yang biasanya Anda dapatkan dari situs developer penyedia. Berikut adalah penyedia identitas yang didukung oleh Firebase dan ID-nya:

Penyedia IdP ID
Apple apple.com
Apple Game Center gc.apple.com
Facebook facebook.com
GitHub github.com
Google google.com
Google Play Game playgames.google.com
LinkedIn linkedin.com
Microsoft microsoft.com
Twitter twitter.com
Yahoo yahoo.com

Misalnya, menggunakan 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);

Jika berhasil, panggilan akan menampilkan konfigurasi yang baru dibuat. Contoh:

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

Jika Anda mencoba mengonfigurasi penyedia identitas yang telah dikonfigurasi untuk project Anda, panggilan akan menampilkan error HTTP 409. Dalam situasi ini, Anda dapat memperbarui konfigurasi, seperti yang dijelaskan di bawah.

Mengupdate konfigurasi penyedia identitas OAuth

Untuk mengaktifkan atau menonaktifkan penyedia identitas OAuth, atau mengupdate konfigurasi klien project Anda, terlebih dahulu dapatkan konfigurasi saat ini dari penyedia dengan membuat permintaan GET ke endpoint projects.defaultSupportedIdpConfigs. Kemudian, buat perubahan yang Anda inginkan pada konfigurasi dan lakuan patch konfigurasi baru ke endpoint projects.defaultSupportedIdpConfigs.

Misalnya, menggunakan 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);

Jika Anda mencoba memperbarui konfigurasi penyedia identitas yang belum pernah dikonfigurasi untuk project Anda, panggilan akan menampilkan error HTTP 404. Sebaliknya, konfigurasikan penyedia identitas baru seperti yang ditampilkan di bagian sebelumnya.