Развертывание приложения Firebase с учетной записью службы в Heroku (переменные среды с dotenv)

У меня есть приложение node, которое использует учетную запись службы firebase. Я хотел бы развернуть приложение в Heroku, но я не хочу публиковать свои секретные ключи. Я развертываю непосредственно из публичного репозитория github, поэтому я не хочу включать файл учетной записи службы в развертывание.

Я могу взять файл учетной записи службы json, сделать каждое свойство переменной среды, добавить каждую из этих переменных в Heroku и развернуть. Все отлично работает (после авторизации нового домена Heroku на моем приложении firebase), но есть ли лучший способ сделать это? Это работает, но это было больно делать (копирование и вставка каждой переменной и ее перемещение). Я пропустил более простой способ сделать это?

Вот изменение, которое я делаю. Из этой строки, где он извлекает учетные данные из файла:

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

Является ли это лучшей практикой для развертывания приложения Firebase с учетной записью службы в Heroku? Я использую модуль dotenv node, чтобы выполнить это.

Ответы

Ответ 1

Есть два обязательных поля для объекта опций cert: clientEmail и privateKey. Ваш пример можно обрезать до:

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

В стороне, некоторые среды могут иметь проблемы с новыми строками в private_key env var; Я нашел key.replace(/\\n/g, '\n') как простое решение.