Programowo skonfiguruj dostawców tożsamości OAuth na potrzeby uwierzytelniania Firebase

Za pomocą interfejsu API REST platformy Google Cloud Identity możesz programowo zarządzać konfiguracją dostawcy tożsamości OAuth (IdP) projektu Firebase. Za pomocą tego interfejsu API możesz skonfigurować dostawców tożsamości, których chcesz obsługiwać, a także aktualizować, włączać i wyłączać bieżące konfiguracje OAuth projektu.

Uzyskaj autoryzację

Zanim będziesz mógł wywołać interfejs API REST, potrzebujesz tokena dostępu OAuth 2.0, który zapewnia dostęp Edytora do Twojego 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 (IdP), Opublikuj nową konfigurację w punkcie końcowym projects.defaultSupportedIdpConfigs .

Będziesz musiał podać identyfikator dostawcy tożsamości oraz swój identyfikator klienta i klucz tajny klienta, które zazwyczaj otrzymujesz z witryny programisty dostawcy. Oto dostawcy tożsamości obsługiwani przez Firebase i ich identyfikatory:

Dostawca Identyfikator dostawcy tożsamości
Jabłko apple.com
Centrum gier Apple gc.apple.com
Facebook facebook.com
GitHub github.com
Google google.com
Gry Google Play playgames.google.com
LinkedIn linkedin.com
Microsoftu microsoft.com
Świergot twitter.com
Wieśniak yahoo.com

Na przykład, używając 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, zwraca nowo utworzoną konfigurację. Na 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 spróbujesz skonfigurować dostawcę tożsamości, który został już skonfigurowany dla Twojego projektu, wywołanie zwróci błąd HTTP 409. W tej sytuacji możesz zamiast tego zaktualizować konfigurację, jak opisano poniżej.

Zaktualizuj konfigurację dostawcy tożsamości OAuth

Aby włączyć lub wyłączyć dostawcę tożsamości OAuth albo zaktualizować konfigurację klienta projektu, najpierw uzyskaj bieżącą konfigurację dostawcy, wysyłając żądanie GET do punktu końcowego projects.defaultSupportedIdpConfigs . Następnie wprowadź żądane zmiany w konfiguracji i POPRAW nową konfigurację w punkcie końcowym projects.defaultSupportedIdpConfigs .

Na przykład, używając 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 spróbujesz zaktualizować konfigurację dostawcy tożsamości, którego nigdy nie skonfigurowałeś dla swojego projektu, wywołania zwrócą błąd HTTP 404. Zamiast tego skonfiguruj nowego dostawcę tożsamości, jak pokazano w poprzedniej sekcji .