Management REST API를 사용하여 Firebase 프로젝트 설정 및 관리

Firebase Management REST API를 사용하면 프로젝트의 Firebase 리소스 및 Firebase 앱을 포함해 Firebase 프로젝트를 프로그래매틱 방식으로 설정 및 관리할 수 있습니다.

이 개요에서는 현재 Firebase 서비스를 사용하지 않는 기존 Google Cloud 프로젝트에 Firebase 리소스와 앱을 추가하는 일반적인 워크플로를 설명합니다.

원하는 경우 이 페이지의 특정 섹션으로 건너뛸 수 있습니다.

이 페이지의 단계를 진행하기 전에 API를 사용 설정해야 합니다.

Firebase Management API의 액세스 관리에 대한 자세한 내용은 Cloud Identity Access Management(IAM) API 문서를 참조하세요.

시작하기 전에

시작하기 전에 Google Cloud 프로젝트에 Management API를 사용 설정하고 액세스 토큰을 생성해야 합니다.

Google Cloud 프로젝트에 Management REST API 사용 설정

Google Cloud 프로젝트에서 사용할 Firebase Management API를 아직 사용 설정하지 않았다면 사용 설정해야 합니다.

  1. Google API 콘솔에서 Firebase Management API 페이지를 엽니다.
  2. 페이지가 표시되면 Google Cloud 프로젝트를 선택합니다.
  3. Firebase Management API 페이지에서 사용 설정을 클릭합니다.

API 액세스 토큰 생성

다음은 액세스 토큰을 가져오는 Node.js의 예시입니다.

먼저 Google Cloud 환경이 아니라면 서비스 계정 키의 경로에 GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정합니다.

Linux 또는 macOS

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-file.json"

Windows

PowerShell:

$env:GOOGLE_APPLICATION_CREDENTIALS="C:\path\to\your\service-account-file.json"

그런 다음 Firebase Admin SDK를 사용하여 서비스 계정 사용자 인증 정보에서 액세스 토큰을 가져옵니다.

const admin = require('firebase-admin');

function getAccessToken() {
  return admin.credential.applicationDefault().getAccessToken()
      .then(accessToken => {
        return accessToken.access_token;
      })
      .catch(err => {
        console.error('Unable to get access token');
        console.error(err);
      });
}

프로젝트의 리소스 이름 찾기

Firebase 서비스를 추가하는 데 사용할 수 있는 Google Cloud 프로젝트를 찾을 수 있습니다.

요청

availableProjects.list를 호출합니다. 이 호출에 대한 요청 본문은 비어 있어야 합니다.

다음은 사용 가능한 Google Cloud 프로젝트 목록을 요청하는 Node.js의 예시입니다.

const fetch = require('node-fetch');

async function listProjects() {
  const accessToken = getAccessToken();
  const uri = 'https://firebase.googleapis.com/v1beta1/availableProjects';
  const options = {
    method: 'GET',
    headers: {
      'Authorization': 'Bearer ' + accessToken,
    },
  };

  try {
    const rawResponse = await fetch(uri, options);
    const resp = await rawResponse.json();
    const projects = resp['projectInfo'];
    console.log('Project total: ' + projects.length);
    console.log('');
    for (let i in projects) {
      const project = projects[i];
      console.log('Project ' + i);
      console.log('ID: ' + project['project']);
      console.log('Display Name: ' + project['displayName']);
      console.log('');
    }
  } catch(err) {
    console.error(err);
  }
}

결과

availableProjects.list 호출의 응답 본문에는 ProjectInfo 객체 목록이 포함됩니다. 프로젝트 목록이 너무 길 경우 프로젝트의 다음 페이지를 가져오는 쿼리 매개변수로 사용할 수 있는 nextPageToken도 응답 본문에 포함됩니다.

다음은 availableProjects.list 호출에 대한 응답 본문의 예시입니다.

{
  "projectInfo": [
    {
      "project": "projects/first-cloud-project",
      "displayName": "First Cloud Project"
    },
    {
      "project": "projects/second-cloud-project",
      "displayName": "Second Cloud Project"
    }
  ]
}

이 응답 예시에는 Firebase 서비스를 추가할 수 있는 2개의 Google Cloud 프로젝트가 있습니다. project 필드는 프로젝트 전역에 고유한 리소스 이름을 제공합니다.

availableProjects.list의 응답에 나열된 project 값을 사용하여 프로젝트에 Firebase 서비스를 추가하거나 앱을 추가할 수 있습니다.

다음 섹션에서는 projects/first-gcp-project 리소스 이름을 사용하여 First Cloud Project에 Firebase 서비스를 추가합니다.

프로젝트에 Firebase 서비스 추가

Firebase에서 제공하는 서비스를 Google Cloud 프로젝트에 활용할 수 있습니다. 이 섹션에서는 기존 Google Cloud 프로젝트에 Firebase 서비스를 프로그래매틱 방식으로 추가하는 방법을 설명합니다. Firebase Console에서도 기존 Google Cloud 프로젝트에 Firebase 서비스를 추가할 수 있습니다.

요청

projects.addFirebase를 호출합니다. 이 호출에 대한 요청 본문은 비어 있어야 합니다.

다음은 Google Cloud 프로젝트에 Firebase 서비스를 추가하는 Node.js의 예시입니다.

const fetch = require('node-fetch');

async function addFirebase(projectId) {
  const accessToken = getAccessToken();
  const uri = 'https://firebase.googleapis.com/v1beta1/projects/' + projectId + ':addFirebase';
  const options = {
    method: 'POST',
    // Use a manual access token here since explicit user access token is required.
    headers: {
      'Authorization': 'Bearer ' + accessToken,
    },
  };

  try {
    const rawResponse = await fetch(uri, options);
    const resp = await rawResponse.json();
    console.log(resp);
  } catch(err) {
    console.error(err['message']);
  }
}

결과

projects.addFirebase를 호출한 결과는 Operation입니다. 프로젝트에서 다른 Firebase 관련 엔드포인트를 호출하려면 먼저 작업에 성공해야 합니다.

작업이 성공했는지 확인하려면 done 값이 true이고 responseFirebaseProject 유형인 결과가 나올 때까지 작업에서 operations.get을 호출하면 됩니다. 작업에 실패하면 errorgoogle.rpc.Status로 설정됩니다.

다음은 operations.get 호출의 응답 본문입니다.

{
  "name": "operations/...",
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.firebase.service.v1beta1.FirebaseProject",
    "projectId": "first-cloud-project",
    "projectNumber": "...",
    "displayName": "First Cloud Project",
    "name": "projects/first-cloud-project",
    "resources": {
      "hostingSite": "first-cloud-project",
      "realtimeDatabaseInstance": "first-cloud-project"
    }
  }
}

donetrue이고 response 유형은 FirebaseProject이므로 이제 Google Cloud 프로젝트에 Firebase 서비스가 있는 것을 알 수 있습니다. 응답에는 projectNumber 및 기본 resources 등 새로 만든 FirebaseProject에 대한 기타 유용한 정보도 포함되어 있습니다. Operation은 완료 후 자동으로 삭제됩니다.

프로젝트에 Firebase 앱 추가

iOS, Android, 웹 앱 등 다양한 앱에서 FirebaseProject를 사용할 수 있습니다. 이 섹션에서는 기존 FirebaseProject에 Firebase 앱을 프로그래매틱 방식으로 추가하는 방법을 알아봅니다. Firebase Console에서도 기존 Firebase 프로젝트에 Firebase 앱을 추가할 수 있습니다.

Firebase 프로젝트에 추가할 Firebase 앱 유형 선택

기존 Firebase 프로젝트에 Firebase Android 앱을 추가할 수 있습니다.

요청

projects.androidApps.create를 호출합니다. 요청 본문을 구성하는 방법은 다음과 같습니다.

  • 필수:

    • packageName: Google Play Console에 표시되는 Android 앱의 표준 패키지 이름입니다.
  • 권장(선택사항):

    • displayName: 사용자가 지정한 앱의 표시 이름입니다. 이 값으로 나중에 Firebase Console에서 앱을 쉽게 찾을 수 있습니다.

이 예시의 요청 본문에서는 packageNamedisplayName을 사용합니다.

{
  "displayName": "My Firebase Android App"
  "packageName": "com.firebase.android"
}

다음은 Firebase 프로젝트에 Firebase Android 앱을 추가하는 Node.js의 예시입니다.

const fetch = require('node-fetch');

async function addAndroidApp(projectId, displayName, packageName) {
  const accessToken = getAccessToken();
  const uri = 'https://firebase.googleapis.com/v1beta1/projects/' + projectId + '/androidApps';
  const options = {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer ' + accessToken,
    },
    body: JSON.stringify({
      'displayName': displayName,
      'packageName': packageName
    }),
  };

  try {
    const rawResponse = await fetch(uri, options);
    const resp = await rawResponse.json();
    console.log(resp);
  } catch(err) {
    console.error(err['message']);
  }
}

결과

projects.androidApps.create를 호출한 결과는 Operation입니다. 프로젝트에서 다른 Firebase 관련 엔드포인트를 호출하려면 먼저 작업에 성공해야 합니다.

작업이 성공했는지 확인하려면 done 값이 true이고 responseAndroidApp 유형인 결과가 나올 때까지 작업에서 operations.get을 호출하면 됩니다. 작업에 실패하면 errorgoogle.rpc.Status로 설정됩니다.

다음은 operations.get 호출의 응답 본문입니다.

{
  "name": "operations/...",
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.firebase.service.v1beta1.AndroidApp",
    "name": "projects/first-cloud-project/androidApps/...",
    "appId": "...",
    "displayName": "My Firebase Android App",
    "projectId": "first-cloud-project",
    "packageName": "com.firebase.android"
  }
}

donetrue이고 response 유형이 AndroidApp이므로 이제 FirebaseProjectAndroidApp이 있는 것을 알 수 있습니다. 응답에는 고유한 Firebase appId 등 새로 만든 Firebase Android 앱에 대한 기타 유용한 정보도 포함되어 있습니다. Operation은 완료 후 자동으로 삭제됩니다.

SHA 인증서 추가

projects.androidApps.sha.create를 호출하여 기존 Firebase Android 앱에 SHA 인증서를 추가할 수 있습니다. 이 메서드 호출의 요청 본문에는 빈 name 필드가 있어야 합니다. 호출하면 새로 만든 ShaCertificate 인스턴스가 결과로 반환됩니다.

projects.androidApps.sha.create를 호출할 때 유효한 SHA-1 또는 SHA-256 인증서 해시를 제공해야 합니다. Gradle signingReport 명령어를 사용하여 서명 인증서의 SHA 해시를 가져올 수 있습니다.

./gradlew signingReport

자세한 내용은 Android용 Google API를 참조하세요.

기존 Google 애널리틱스 계정을 기존 FirebaseProject에 프로그래매틱 방식으로 연결할 수 있습니다. 프로젝트 설정통합 탭에서도 기존 Firebase 프로젝트를 Google 애널리틱스에 연결할 수 있습니다.

projects.addGoogleAnalytics를 호출하려면 analyticsAccountId 또는 analyticsPropertyId와 같은 analytics_resource가 필요합니다.

  • 지정된 계정에 새 Google 애널리틱스 속성을 프로비저닝하고 새 속성을 Firebase 프로젝트에 연결하려면 기존 analyticsAccountId를 지정합니다.

  • Google 애널리틱스 속성을 Firebase 프로젝트에 연결하려면 기존 analyticsPropertyId를 지정합니다.

Google 애널리틱스 웹사이트에서 analyticsAccountId 및 기존 analyticsPropertyId를 모두 확인할 수 있습니다.

projects.addGoogleAnalytics 호출 시 참고사항

  1. 첫 번째 확인에서 데이터 스트림과 연결된 packageName 또는 bundleId를 기준으로 Google 애널리틱스 속성의 기존 데이터 스트림이 FirebaseProject의 기존 Firebase 앱에 해당하는지 여부를 파악합니다. 해당하는 경우 데이터 스트림과 앱이 연결됩니다. 자동 연결은 Android 앱 및 iOS 앱에만 적용됩니다.

  2. Firebase 앱에 해당하는 데이터 스트림이 없으면 각 Firebase 앱의 Google 애널리틱스 속성에 새 데이터 스트림이 프로비저닝됩니다. 새 데이터 스트림은 이전에 애널리틱스 속성의 데이터 스트림과 연결되었더라도 항상 웹 앱에 프로비저닝됩니다.

애널리틱스 문서에서 Google 애널리틱스 계정의 계층 구조와 일반 구조에 대해 자세히 알아보세요.

요청

projects.addGoogleAnalytics를 호출합니다.

project.addGoogleAnalytics 호출 예시의 요청 본문에 Google 애널리틱스 계정 analyticsAccountId를 지정합니다. 이 호출은 새 Google 애널리틱스 속성을 프로비저닝하고 새 속성을 FirebaseProject와 연결합니다.

{
  "analyticsAccountId": "<your-google-analytics-account-id>"
}

다음은 Firebase 프로젝트를 Google 애널리틱스 계정과 연결하는 Node.js의 예시입니다.

const fetch = require('node-fetch');

async function addGoogleAnalytics(projectId, analyticsAccountId) {
  const accessToken = getAccessToken();
  const uri = 'https://firebase.googleapis.com/v1beta1/projects/' + projectId + ':addGoogleAnalytics';
  const options = {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer ' + accessToken,
    },
    body: JSON.stringify({
      'analyticsAccountId': analyticsAccountId
    }),
  };

  try {
    const rawResponse = await fetch(uri, options);
    const resp = await rawResponse.json();
    console.log(resp);
  } catch(err) {
    console.error(err['message']);
  }
}

결과

projects.addGoogleAnalytics를 호출한 결과는 Operation입니다. 프로젝트에서 다른 Firebase 관련 엔드포인트를 호출하려면 먼저 작업에 성공해야 합니다.

작업이 성공했는지 확인하려면 done 값이 true이고 responseanalyticsDetails 유형인 결과가 나올 때까지 작업에서 operations.get을 호출하면 됩니다. 작업에 실패하면 errorgoogle.rpc.Status로 설정됩니다.

다음은 operations.get 호출의 응답 본문입니다.

{
  "name": "operations/...",
  "none": true,
  "response": {
    "@type": "type.googleapis.com/google.firebase.service.v1beta1.AnalyticsDetails",
    "analyticsProperty": [
      {
        "id": "...",
        "displayName": "..."
      }
    ],
    "streamMappings": [
      {
        "app": "...",
        "streamId": "...",
        "measurementId": "..."
      }
    ]
  }
}

done이 true이고 response 유형이 analyticsDetails이므로 FirebaseProject가 이제 지정된 Google 애널리틱스 계정과 연결된 것을 알 수 있습니다. Operation은 완료 후 자동으로 삭제됩니다.

프로젝트 기본 위치 확정(선택사항)

Firebase 프로젝트에서 Cloud Firestore, Cloud Storage 또는 App Engine 앱을 사용할 경우 프로젝트의 기본 Google Cloud Platform(GCP) 리소스 위치를 프로그래매틱 방식으로 확정할 수 있습니다. Firebase Console에서도 위치를 선택할 수 있습니다.

이 위치를 설정하기 전에 프로젝트 위치 선택에서 프로젝트에 가장 적합한 위치에 대한 정보를 확인하세요. 또한 프로젝트가 Google Cloud 조직에 속하는 경우 조직 정책에 따라 프로젝트에 유효한 위치가 제한될 수 있으므로 projects.availableLocations를 호출하여 프로젝트에 유효한 위치 목록을 반환해야 합니다.

defaultLocation.finalize 메서드를 호출하면 요청 본문에 제공된 locationId에 위치한 기본 Cloud Storage 버킷에 App Engine 애플리케이션이 생성됩니다.

Project에 이미 App Engine 애플리케이션이 있거나 이 defaultLocation.finalize 메서드를 이전에 호출했다면 기본 GCP 리소스 위치가 이미 지정되어 있을 수 있습니다.

요청

projects.defaultLocation.finalize를 호출합니다. 요청 본문을 구성하는 방법은 다음과 같습니다.

  • 필수:

    • locationId: Cloud Firestore 또는 Cloud Storage와 같이 위치 설정이 필요한 GCP 서비스의 데이터가 저장되는 위치입니다.
{
  "locationId": "us-west2"
}

다음은 프로젝트의 기본 위치를 확정하는 Node.js의 예시입니다.

const fetch = require('node-fetch');

async function finalizeProjectLocation(projectId, locationId) {
  const accessToken = getAccessToken();
  const uri = 'https://firebase.googleapis.com/v1beta1/projects/' + projectId + '/defaultLocation:finalize';
  const options = {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer ' + accessToken,
    },
    body: JSON.stringify({
      'locationId': locationId
    }),
  };

  try {
    const rawResponse = await fetch(uri, options);
    const resp = await rawResponse.json();
    console.log(resp);
  } catch(err) {
    console.error(err['message']);
  }
}

결과

projects.defaultLocation.finalize를 호출한 결과는 Operation입니다. 프로젝트에서 다른 Firebase 관련 엔드포인트를 호출하려면 먼저 작업에 성공해야 합니다.

작업이 성공했는지 확인하려면 done 값이 true이고 responsegoogle.protobuf.Empty 유형인 결과가 나올 때까지 작업에서 operations.get을 호출하면 됩니다. 작업에 실패하면 응답 본문 errorgoogle.rpc.Status 유형이 됩니다. Operation은 완료 후 자동으로 삭제됩니다.