programing

Heroku에 서비스 계정이 있는 Firebase App 배포(dotenv가 있는 환경 변수)

elecom 2023. 6. 7. 22:08
반응형

Heroku에 서비스 계정이 있는 Firebase App 배포(dotenv가 있는 환경 변수)

파이어베이스 서비스 계정을 사용하는 노드 애플리케이션이 있습니다.나는 헤로쿠에 앱을 배포하고 싶지만, 나의 비밀 키를 공개하고 싶지 않습니다.공용 github repo에서 직접 배포하기 때문에 배포에 서비스 계정 파일을 포함하고 싶지 않습니다.

서비스 계정 json 파일을 가져와서 각 속성을 환경 변수로 만들고 Heroku에 각 변수를 추가하여 배포할 수 있습니다.(내 파이어베이스 애플리케이션에서 새로운 헤로쿠 도메인을 승인한 후) 모든 것이 잘 작동하지만, 이를 위한 더 나은 방법이 있습니까?이것은 효과가 있지만 (각 변수를 복사하여 붙여넣고 이동하는) 일종의 고통이었습니다.제가 더 쉬운 방법을 놓쳤나요?

이것이 제가 변화를 주고 있는 것입니다.파일에서 자격 증명을 가져오는 이 줄에서:

admin.initializeApp({
  credential: admin.credential.cert('./path/firebase-service-account.json'),
  databaseURL: "https://my-firebase-app.firebaseio.com"
});

환경 변수에서 동일한 모든 것을 가져오는 이 개체:

admin.initializeApp({
  credential: admin.credential.cert({
    "type": process.env.FIREBASE_TYPE,
    "project_id": process.env.FIREBASE_PROJECT_ID,
    "private_key_id": process.env.FIREBASE_PRIVATE_KEY_ID,
    "private_key": process.env.FIREBASE_PRIVATE_KEY,
    "client_email": process.env.FIREBASE_CLIENT_EMAIL,
    "client_id": process.env.FIREBASE_CLIENT_ID,
    "auth_uri": process.env.FIREBASE_AUTH_URI,
    "token_uri": process.env.FIREBASE_TOKEN_URI,
    "auth_provider_x509_cert_url": process.env.FIREBASE_AUTH_PROVIDER_X509_CERT_URL,
    "client_x509_cert_url": process.env.FIREBASE_CLIENT_X509_CERT_URL
  }),
  databaseURL: "https://my-firebase-app.firebaseio.com"
});

이것이 Heroku에 서비스 계정이 있는 Firebase 애플리케이션을 배포하는 최선의 방법입니까?저는 이를 위해 dotenv 노드 모듈을 사용하고 있습니다.

인증서 옵션 개체에는 다음과 같은 세 가지 필수 필드가 있습니다.clientEmail그리고.privateKey(그리고 지금도.projectId). 예제를 다음으로 축소할 수 있습니다.

admin.initializeApp({
  credential: admin.credential.cert({
    "projectId": process.env.FIREBASE_PROJECT_ID,
    "private_key": process.env.FIREBASE_PRIVATE_KEY,
    "client_email": process.env.FIREBASE_CLIENT_EMAIL,
  }),
  databaseURL: "https://my-firebase-app.firebaseio.com"
});

별도로, 일부 환경에서는 새로운 라인에 문제가 있을 수 있습니다.private_keyenvar; 찾았습니다.key.replace(/\\n/g, '\n')간단한 해결책이 될 수 있습니다.

  1. Firebase 구성 JSON(serviceAccountKey)을 base64 인코딩 문자열로 변환합니다. 이 작업은 openssl 명령을 사용하는 것과 같은 다양한 방법으로 수행할 수 있습니다.openssl base64 -in <firebaseConfig.json> -out <firebaseConfigBase64.txt>또는 아래 그림과 같이 Nodejs를 사용합니다.
Buffer.from(JSON.stringify({
  "type": "",
  "project_id": "",
  "private_key_id": "",
  "private_key": "",
  "client_email": "",
  "client_id": "",
  "auth_uri": "",
  "token_uri": "",
  "auth_provider_x509_cert_url": "",
  "client_x509_cert_url": ""
})).toString('base64')
  1. 위 단계의 출력 base64 인코딩된 문자열을 다음과 같은 환경 변수에 저장합니다.GOOGLE_CONFIG_BASE64(헤로쿠의 경우 ConfigVars에 저장)
  2. 노드 응용 프로그램에서 FirebaseSdk 초기화
const firebaseAdminSdk = require('firebase-admin'),
    firebaseAdminApp = firebaseAdminSdk.initializeApp({credential: firebaseAdminSdk.credential.cert(
      JSON.parse(Buffer.from(process.env.GOOGLE_CONFIG_BASE64, 'base64').toString('ascii')))
});

파이어베이스 서비스 계정을 사용하는 herku에 앱을 배포할 때 제가 개인적으로 선호하는 상위 답변과는 약간 다른 접근 방식이 있습니다.

  • 다음 형식으로 Firebase 응용 프로그램을 초기화합니다.
const admin = require("firebase-admin");
require("dotenv").config();

const serviceAccount = JSON.parse(process.env.GOOGLE_CREDS);
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});
  • 서비스 계정 키 파일의 내용을 JSON으로 복사하고 .env에서 이 값을 가져오도록 GOOGLE_CREDS를 설정합니다..env가 문자열로 읽듯이 기본적으로 JSON의 모든 새 줄을 제거해야 합니다.다음은 보기에 대한 예입니다.
GOOGLE_CREDS={"type": "service_account","project_id": "your-project-id","private_key_id": "your-private-key-id", ...}
  • 동일한 키 값을 동일한 형식으로 복사하여 herku 구성 변수에 붙여넣습니다.

이것이 도움이 되길 바랍니다, 감사합니다.

저는 또한 @Huzaifa가 @Steve의 수표와 결합한 것을 추적했고 그것은 효과가 있었습니다!

json 파일을 base64 문자열로 변환한 후.herku의 env 파일과 구성 변수에 추가했습니다.

내 코드는 다음과 같습니다.

firebase.js 파일

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

const googleServiceAccountCreds = process.env.GOOGLE_SERVICE_ACCOUNT_CREDS;
if (!googleServiceAccountCreds) throw new Error('The $GOOGLE_SERVICE_ACCOUNT_CREDS environment variable was not found!');

firebaseAdmin.initializeApp({credential: firebaseAdmin.credential.cert(JSON.parse(Buffer.from(googleServiceAccountCreds, 'base64').toString('ascii')))})

const db = firebaseAdmin.firestore();
const auth = firebaseAdmin.auth();

module.exports = {
  db,
  auth
};

FWIW 나는 JSON 문자열을 인코딩하지 않은 base64를 제외하고는 @Huzaifa와 동일한 작업을 수행했으며, 지금까지 잘 작동했습니다.

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

// login and return a ref to the root of the firebase
function loginToFirebase() {
    // JSON stored in this env variable must come from Firebase Admin SDK service account's private key:
    // https://console.firebase.google.com/u/0/project/<your firebase>/settings/serviceaccounts/adminsdk
    const googleAuthJson = process.env.GOOGLE_AUTH_JSON;
    if (!googleAuthJson) throw new Error('The $GOOGLE_AUTH_JSON environment variable was not found!');

    return firebaseAdminSdk.initializeApp({
        credential: firebaseAdminSdk.credential.cert(JSON.parse(googleAuthJson)),
        databaseURL: "https://<your firebase>.firebaseio.com"
    }).database();
}

밖에 있는 파이썬 사람들을 위해.

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import json
import os

firebase_admin.initialize_app(credential=credentials.Certificate({**json.loads(os.environ['FIREBASE_AUTH_1']), **json.loads(os.environ['FIREBASE_AUTH_2'])}))

db = firestore.client()

참고: Windows 환경 변수가 잘려서 json을 2개의 환경 변수로 분류했습니다.

방금 Diokas 솔루션을 구축했습니다. 변경 사항은 다음과 같습니다..env다음과 같습니다.

admin sdk의 N.B.에 전체 구성 파일이 필요합니다.

FIREBASE_CREDS={"type","projectId","private_key","client_email"}
FIREBASE_DATABASE_URL=...

그리고나서

var admin = require('firebase-admin');
require('dotenv').config();

const serviceAccount = JSON.parse(process.env.FIREBASE_CREDS);

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: process.env.FIREBASE_DATABASE_URL,
});
var db = admin.database();
module.exports = db;

언급URL : https://stackoverflow.com/questions/41287108/deploying-firebase-app-with-service-account-to-heroku-environment-variables-wit

반응형