web-dev-qa-db-ja.com

Node.js -Firebaseサービスアカウントの秘密キーが解析されない

App.jsファイルで.env変数を使用してキーにアクセスします。新しいFirebase Service Account Private Keyをダウンロードするまで、すべてが問題なく動作していました。古い値を新しい値に置き換えると、キーにアクセスできなくなります。terminalnode 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形式のメッセージ。 at FirebaseAppError.FirebaseError [コンストラクタとして](/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/utils/error.js:39:28)at FirebaseAppError.PrefixedFirebaseError [コンストラクタとして](/ Users/Cpu/Desktop /...../ node_modules/firebase-admin/lib/utils/error.js:85:28)at new 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)新しいCertCredential(/Users/Cpu/Desktop/...../node_modules/firebase-admin/lib/auth/credential.js:192:64)at Object.cert(/ Users/Cpu/Desktop/... ..)Objectで。 (/Users/Cpu/Desktop/...../app.js:14:32)at Module._compile(module.js:571:32)at Object.Module._extensions..js(module.js:580 :10)at Module.load(module.js:488:32)at FirebaseAppError.FirebaseError [コンストラクタとして] npm ERR!コードELIFECYCLE npm ERR!エラー番号1

私が行ったのは、新しいPrivate Keyをc + pしてから追加し、.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
});

この問題を解決するにはどうすればよいですか?

20
Lance Samaria

問題は、_.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
});
_
37
Lance Samaria

dotenvのドキュメントに従って、拡張された改行オプションを許可するには、キーを二重qoutesに追加する必要があります。

このオプションは、dotenv githubの[Rules]セクションで確認できます。

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"
5
Bryan Ramirez