Configurer par programme les fournisseurs d'identité OAuth pour l'authentification Firebase

Vous pouvez utiliser l' API REST de Google Cloud Identity Platform pour gérer par programmation la configuration du fournisseur d'identité OAuth (IdP) d'un projet Firebase. Avec cette API, vous pouvez configurer les fournisseurs d'identité que vous souhaitez prendre en charge, et mettre à jour, activer et désactiver les configurations OAuth actuelles de votre projet.

Obtenir une autorisation

Avant de pouvoir appeler l'API REST, vous avez besoin d'un jeton d'accès OAuth 2.0 qui accorde l'accès éditeur à votre projet Firebase. Par exemple, pour obtenir un jeton d'accès à l'aide d'un compte de service dans 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);
}

Ajouter une nouvelle configuration de fournisseur d'identité OAuth

Pour ajouter une nouvelle configuration de fournisseur d'identité (IdP) OAuth, POSTez la nouvelle configuration sur le point de projects.defaultSupportedIdpConfigs .

Vous devrez spécifier l'ID du fournisseur d'identité ainsi que votre ID client et votre secret client, que vous obtenez généralement sur le site de développement du fournisseur. Voici les fournisseurs d'identité pris en charge par Firebase et leurs identifiants :

Fournisseur ID du fournisseur d'identité
Pomme apple.com
Centre de jeux Apple gc.apple.com
Facebook facebook.com
GitHub github.com
Google google.com
Jeux Google Play playgames.google.com
LinkedIn linkedin.com
Microsoft microsoft.com
Twitter twitter.com
Yahoo yahoo.com

Par exemple, en utilisant 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);

Si l'appel réussit, il renvoie la configuration nouvellement créée. Par exemple:

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

Si vous essayez de configurer un fournisseur d'identité déjà configuré pour votre projet, l'appel renvoie l'erreur HTTP 409. Dans cette situation, vous pouvez mettre à jour la configuration à la place, comme décrit ci-dessous.

Mettre à jour la configuration d'un fournisseur d'identité OAuth

Pour activer ou désactiver un fournisseur d'identité OAuth, ou mettre à jour la configuration client de votre projet, obtenez d'abord la configuration actuelle du fournisseur en envoyant une requête GET au point de projects.defaultSupportedIdpConfigs . Ensuite, apportez les modifications souhaitées à la configuration et corrigez la nouvelle configuration vers le point de projects.defaultSupportedIdpConfigs .

Par exemple, en utilisant 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);

Si vous essayez de mettre à jour la configuration d'un fournisseur d'identité que vous n'avez jamais configuré pour votre projet, les appels renverront l'erreur HTTP 404. Configurez plutôt un nouveau fournisseur d'identité comme indiqué dans la section précédente .