ارائه‌دهندگان هویت OAuth را برای احراز هویت Firebase پیکربندی کنید

می‌توانید از 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 (IdP)، پیکربندی جدید را در نقطه پایانی projects.defaultSupportedIdpConfigs پست کنید.

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

ارائه دهنده IDP ID
سیب apple.com
مرکز بازی اپل gc.apple.com
فیس بوک facebook.com
GitHub github.com
گوگل google.com
بازی های گوگل پلی playgames.google.com
لینکدین linkedin.com
مایکروسافت microsoft.com
توییتر twitter.com
یاهو 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 را برمی‌گرداند. در عوض، یک ارائه‌دهنده هویت جدید را همانطور که در بخش قبل نشان داده شده است پیکربندی کنید.