กำหนดค่าผู้ให้บริการข้อมูลประจำตัว OAuth สำหรับการตรวจสอบสิทธิ์ Firebase แบบเป็นโปรแกรม

คุณสามารถใช้ REST API ของ Google Cloud Identity Platform เพื่อ จัดการผู้ให้บริการข้อมูลประจำตัว (IdP) OAuth ของโปรเจ็กต์ 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 ใหม่

หากต้องการเพิ่มการกำหนดค่าผู้ให้บริการข้อมูลประจำตัว (IdP) OAuth ใหม่ ให้ POST ใหม่ การกำหนดค่าเป็นprojects.defaultSupportedIdpConfigs ปลายทาง

คุณจะต้องระบุรหัสของผู้ให้บริการข้อมูลประจำตัวและรหัสไคลเอ็นต์ และ รหัสลับไคลเอ็นต์ ซึ่งมักจะได้มาจากเว็บไซต์ของนักพัฒนาซอฟต์แวร์ของผู้ให้บริการนั้นๆ ที่นี่ คือผู้ให้บริการข้อมูลประจำตัวที่ Firebase รองรับและรหัสของผู้ให้บริการดังกล่าว

ผู้ให้บริการ รหัส IdP
Apple apple.com
เกมเซ็นเตอร์ของ Apple gc.apple.com
Facebook 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 แต่ กำหนดค่าผู้ให้บริการข้อมูลประจำตัวใหม่ตามที่แสดงใน