簡體   English   中英

Node.js - Firebase 服務帳戶私鑰不會解析

[英]Node.js -Firebase Service Account Private Key won't parse

我在 app.js 文件中使用.env變量來訪問密鑰。 一切正常,直到我下載了新的Firebase Service Account Private Key 當我用新值替換舊值時,我無法再訪問密鑰,因為在terminal中,當我運行node app.js時,我不斷收到一條錯誤消息:

/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/auth/credential.js:129 throw new error_1.FirebaseAppError(error_1.AppErrorCodes.INVALID_CREDENTIAL, '無法解析私鑰:' + 錯誤); ^

錯誤:無法解析私鑰:錯誤:無效的 PEM 格式消息。 在 FirebaseAppError.FirebaseError [作為構造函數] (/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/utils/error.js:39:28) 在 FirebaseAppError.PrefixedFirebaseError [作為構造函數] (/用戶/Cpu/Desktop/...../node_modules/firebase-admin/lib/utils/error.js:85:28) 在新的 FirebaseAppError (/Users/Cpu/Desktop/...../node_modules/firebase -admin/lib/utils/error.js:119:28)在新證書(/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/auth/credential.js:129:19)在 Object.cert (/Users/Cpu/Desktop/... ..) 在 Object。 (/Users/Cpu/Desktop/...../app.js:14:32) 在 Module._compile (module.js:571:32) 在 Object.Module._extensions..js (module.js:580 :10) 在 Module.load (module.js:488:32) 在 FirebaseAppError.FirebaseError [作為構造函數] npm 錯誤! 代碼 ELIFECYCLE npm 錯誤! 錯誤號 1

我所做的只是 c+p 新的Private Key ,然后添加它並保存.env文件,推送到 heroku,它不再工作。 我什至下載了一個新的Private Key ,但同樣的問題發生了。

舊私鑰和新私鑰

// old Private Key
-----BEGIN PRIVATE KEY-----\nbbbbbbbb\n-----END PRIVATE KEY-----\n

// new Private Key
-----BEGIN PRIVATE KEY-----\nzzzzzzzz\n-----END PRIVATE KEY-----\n

.env 文件:

FIREBASE_PROJECT_ID=wwwwwwww
FIREBASE_CLIENT_EMAIL=xxxxxxxx
FIREBASE_DATABASE_URL=yyyyyyyy
FIREBASE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\nzzzzzzzz\n-----END PRIVATE KEY-----\n

app.js 文件:

const dotenv = require('dotenv');
dotenv.load();

var admin = require("firebase-admin");
admin.initializeApp({
  credential: admin.credential.cert({
      projectId: process.env.FIREBASE_PROJECT_ID,   // I get no error here
      clientEmail: process.env.FIREBASE_CLIENT_EMAIL,   // I get no error here
      privateKey: process.env.FIREBASE_PRIVATE_KEY   // I get error HERE
  }),
  databaseURL: process.env.FIREBASE_DATABASE_URL
});

我該如何解決這個問題?

問題是因為我在.env文件中使用了dotenv變量,所以FIREBASE_PRIVATE_KEY有轉義字符: \n里面。

我必須遵循這個答案並將.replace(/\\n/g, '\n')附加到它的末尾以解析它:

privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n')

所以現在代碼看起來像:

admin.initializeApp({
  credential: admin.credential.cert({
      projectId: process.env.FIREBASE_PROJECT_ID, // I get no error here
      clientEmail: process.env.FIREBASE_CLIENT_EMAIL, // I get no error here
      privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n') // NOW THIS WORKS!!!
  }),
  databaseURL: process.env.FIREBASE_DATABASE_URL
});

您必須根據dotenv文檔將密鑰添加到雙引號中以允許擴展新行選項。

您可以在dotenv github 的規則部分檢查該選項。

https://github.com/motdotla/dotenv#rules

  FIREBASE_PROJECT_ID=wwwwwwww
  FIREBASE_CLIENT_EMAIL=xxxxxxxx
  FIREBASE_DATABASE_URL=yyyyyyyy
  FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nzzzzzzzz\n-----END PRIVATE KEY-----\n"

我相信 cert 函數正在等待 JSON 對象嘗試將密鑰轉換為 JSON,我認為它會起作用

credential: admin.credential.cert(JSON.parse(serviceAccountKey))

這對我有用!

更新:2022

如果有人仍在尋找以下配置的解決方案,這就是我解決它的方法。

堆:

TypeScript Express Dotenv Heroku

將整個 JSON 文件轉換為 BASE64

使用此鏈接轉換Base64 編碼器,或者您也可以使用任何其他工具。

在 .env 中添加編碼字符串

FIREBASE_API_KEY=<your_large_base64_string>

然后下面是firebase-init.ts使用密鑰的代碼。

import * as admin from 'firebase-admin';

declare var process: {
    env: {
        FIREBASE_KEYS: string;
    }
}
const initializeFirebaseAdmin = (isProd = true) => {
    const firebase_private_key_b64 = Buffer.from(process.env.FIREBASE_KEYS, 'base64');
    const firebase_private_key = firebase_private_key_b64.toString('utf8');
    admin.initializeApp({
        credential: admin.credential.cert(JSON.parse(firebase_private_key))
    });
}


export { initializeFirebaseAdmin }

對我來說,我只是將整個服務帳戶放在我的.env文件中,如下所示:

.env

FIREBASE_ADMIN_API={"type":..."private_key":"..."...}

然后我像這樣導入它:

服務器.ts

const firebase_admin_config = JSON.parse(process.env.FIREBASE_ADMIN_API);

getApps().length === 0 ? initializeApp({
  credential: credential.cert(firebase_admin_config)
}) : getApp();

Firebase > Settings > Admin SDK Firebase 下生成 admin SDK Firebase 在你的項目中進入谷歌雲平台,點擊IAM 管理員>源賬戶,在賬戶服務中生成密鑰代碼(你的賬戶服務在 admin SDK Firebase 中生成)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM