[英]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.