پیکربندی برنامه‌ریزی‌شده ارائه‌دهندگان هویت OAuth برای «اصالت‌سنجی Firebase»

می‌توانید از Google Cloud Identity Platform REST API برای مدیریت برنامه‌ریزی‌شده پیکربندی ارائه‌دهنده هویت OAuth پروژه Firebase (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)، پیکربندی جدید را در نقطه پایان projects.defaultSupportedIdpConfigs پست کنید.

باید شناسه ارائه‌دهنده هویت و شناسه کارخواه و رمز کارخواه خودتان را مشخص کنید، که معمولاً از سایت توسعه‌دهنده ارائه‌دهنده دریافت می‌کنید. در اینجا ارائه‌دهندگان هویت که Firebase پشتیبانی می‌کند و شناسه‌های آن‌ها آمده است:

ارائه‌دهنده شناسه IdP
Apple apple.com
مرکز بازی Apple gc.apple.com
فیس‌بوک facebook.com
GitHub github.com
Google google.com
Google Play Games 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، پیکربندی فعلی ارائه‌دهنده را دریافت کنید. سپس، تغییرات موردنظرتان را در پیکربندی اعمال کنید و پیکربندی جدید را به نقطه پایانی 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 برمی‌گردانند. به‌جای آن، ارائه‌دهنده هویت جدیدی را همان‌طور که در بخش قبلی نشان داده شده است پیکربندی کنید.