Automatyczne konfigurowanie dostawców tożsamości OAuth na potrzeby uwierzytelniania Firebase

Interfejs Google Cloud Identity Platform API typu REST umożliwia Ci automatyczne zarządzanie dostawcą tożsamości OAuth (IdP) projektu Firebase konfiguracji. Za pomocą tego interfejsu API możesz skonfigurować dostawców tożsamości, których chcesz używać obsługi i aktualizowania, włączania i wyłączania bieżącego protokołu OAuth w projekcie konfiguracji.

Pobranie autoryzacji

Aby móc wywoływać interfejs API REST, potrzebujesz tokena dostępu OAuth 2.0, który przyznaje Uprawnienia do edycji projektu Firebase. Na przykład, aby uzyskać token dostępu za pomocą konta usługi w 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);
}

Dodaj nową konfigurację dostawcy tożsamości OAuth

Aby dodać nową konfigurację dostawcy tożsamości OAuth, opublikuj nową konfigurację na potrzeby konfiguracji projects.defaultSupportedIdpConfigs punktu końcowego.

Musisz podać identyfikator dostawcy tożsamości i swój identyfikator klienta oraz tajny klucz klienta, który zwykle znajdziesz w witrynie dla programistów dostawcy. Tutaj to dostawcy tożsamości obsługiwane przez Firebase i ich identyfikatory:

Dostawca Identyfikator dostawcy tożsamości
Apple apple.com
Apple Game Center gc.apple.com
Facebook facebook.com
GitHub github.com
Google google.com
Gry Google Play playgames.google.com
LinkedIn linkedin.com
Microsoft microsoft.com
Twitter twitter.com
Yahoo yahoo.com

Na przykład użycie środowiska 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);

Jeśli wywołanie się powiedzie, zostanie zwrócona nowo utworzona konfiguracja. Przykład:

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

Jeśli próbujesz skonfigurować dostawcę tożsamości, który został już skonfigurowany dla Twojego projektu, wywołanie zwraca błąd HTTP 409. W takiej sytuacji możesz zaktualizuj konfigurację w sposób opisany poniżej.

Zaktualizowanie konfiguracji dostawcy tożsamości OAuth

Aby włączyć lub wyłączyć dostawcę tożsamości OAuth albo zaktualizować klienta projektu pobierz najpierw bieżącą konfigurację dostawcy, tworząc metodę GET do punktu końcowego projects.defaultSupportedIdpConfigs. Następnie wprowadź odpowiednie zmiany w konfiguracji i uzupełnij nową na potrzeby konfiguracji projects.defaultSupportedIdpConfigs punktu końcowego.

Na przykład użycie środowiska 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);

Jeśli próbujesz zaktualizować konfigurację dostawcy tożsamości, który nigdy skonfigurowany dla projektu, wywołania będą zwracać błąd HTTP 404. Zamiast tego: skonfiguruj nowego dostawcę tożsamości zgodnie z instrukcjami w poprzedniej sekcji .