Firebase Authentication için OAuth kimlik sağlayıcılarını programatik olarak yapılandırma

Google Cloud Identity Platform REST API'yi kullanarak Firebase projesinin OAuth kimlik sağlayıcısını (IdP) programatik olarak yönetme yapılandırma. Bu API ile istediğiniz kimlik sağlayıcıları yapılandırabilirsiniz. ve bu OAuth'un mevcut OAuth kullanımını desteklemek ve güncellemek, etkinleştirmek ve devre dışı bırakmak için yapılandırmanın üç yolu vardır.

Yetkilendirmeyi al

REST API'yi çağırabilmeniz için öncelikle, Firebase projenize düzenleyici erişimi. Örneğin, bir erişim jetonu almak için Node.js'de bir hizmet hesabı kullanarak:

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);
}

Yeni bir OAuth kimlik sağlayıcı yapılandırması ekleyin

Yeni bir OAuth kimlik sağlayıcı (IdP) yapılandırması eklemek için yeni projects.defaultSupportedIdpConfigs için yapılandırma uç nokta.

Kimlik sağlayıcı kimliğini ve istemci kimliğinizi belirtmeniz gerekir. genellikle sağlayıcının geliştirici sitesinden aldığınız istemci gizli anahtarı. Burası Firebase'in desteklediği kimlik sağlayıcılar ve kimlikleri şunlardır:

Sağlayıcı IdP Kimliği
Apple apple.com
Apple Oyun Merkezi 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

Örneğin, Node.js kullanarak:

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);

Çağrı başarılı olursa, yeni oluşturulan yapılandırmayı döndürür. Örneğin:

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

Daha önce yapılandırılmış bir kimlik sağlayıcıyı yapılandırmaya çalışırsanız çağrı, projeniz için HTTP 409 hatası döndürüyor. Böyle bir durumda, yapılandırmayı aşağıda açıklandığı gibi güncelleyin.

OAuth kimlik sağlayıcı yapılandırmasını güncelleme

Bir OAuth kimlik sağlayıcısını etkinleştirmek veya devre dışı bırakmak ya da projenizin istemcisini güncellemek için yapılandırmasının ayarlarını yapmak için bir GET projects.defaultSupportedIdpConfigs uç noktasına isteği gönderebilirsiniz. Ardından, yapılandırmada istediğiniz değişiklikleri yapın ve yeni yapılandırmaya yama ekleyin. projects.defaultSupportedIdpConfigs için yapılandırma uç nokta.

Örneğin, Node.js kullanarak:

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);

Daha önce hiç yapmadığınız bir kimlik sağlayıcının yapılandırmasını güncellemeye çalışırsanız yapılandırdıysanız çağrılar HTTP 404 hatası döndürecektir. Bunun yerine aşağıda gösterildiği gibi yeni bir kimlik sağlayıcı yapılandırın: bölümünü inceleyin.