无法将RSA私钥设置为config var

Fra*_*teo 11 heroku

我正在尝试将Express应用程序部署到Heroku.我遇到的麻烦是Heroku或其他方面的东西搞砸了RSA私钥字符串的格式.我在我的.env本地工作中有以下内容,并且不在git中:

TYPE=
PROJECT_ID=
PRIVATE_KEY_ID=
PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
CLIENT_EMAIL=
CLIENT_ID=
AUTH_URI=
TOKEN_URI=
AUTH_CERT_URL=
CLIENT_CERT_URL=
Run Code Online (Sandbox Code Playgroud)

我最初使用https://github.com/xavdid/heroku-config来设置上面的变量而不是通过Heroku上的仪表板手动完成,但是私钥失败了.

然后我尝试通过Heroku Dashboard复制/粘贴(没有双引号)手动设置该值,仍然失败.

最后我通过设置值heroku config:set,但仍然无法在应用启动时解析它.

我甚至尝试替换\n,'\n'因为有人在这里使用引号heroku config:set PRIVATE_KEY="",但仍然无效.

所以我的问题是,Heroku是否用长串值做了一些时髦的东西?或者我错过了什么.调用/使用上述值,如下所示:

const { credential } = require('firebase-admin')

exports.serviceAccount = {
  type: process.env.TYPE,
  project_id: process.env.PROJECT_ID,
  private_key_id: process.env.PRIVATE_KEY_ID,
  private_key: process.env.PRIVATE_KEY,
  client_email: process.env.CLIENT_EMAIL,
  client_id: process.env.CLIENT_ID,
  auth_uri: process.env.AUTH_URI,
  token_uri: process.env.TOKEN_URI,
  auth_provider_x509_cert_url: process.env.AUTH_CERT_URL,
  client_x509_cert_url: process.env.CLIENT_CERT_URL
}

exports.credential = credential.cert(exports.serviceAccount)

exports.databaseURL = process.env.DATABASE_URL

exports.adminConfig = {
  credential: exports.credential,
  databaseURL: exports.databaseURL
}
Run Code Online (Sandbox Code Playgroud)

和Heroku的日志:

2017-06-05T01:50:13.761150+00:00 app[web.1]: > NODE_ENV=production node ./server/server.prod.js
2017-06-05T01:50:14.231853+00:00 app[web.1]: /app/node_modules/firebase-admin/lib/auth/credential.js:129
2017-06-05T01:50:14.231876+00:00 app[web.1]:             throw new error_1.FirebaseAppError(error_1.AppErrorCodes.INVALID_CREDENTIAL, 'Failed to parse private key: ' + error);
2017-06-05T01:50:14.231877+00:00 app[web.1]:             ^
2017-06-05T01:50:14.231878+00:00 app[web.1]:
2017-06-05T01:50:14.231878+00:00 app[web.1]: Error: Failed to parse private key: Error: Invalid PEM formatted message.
2017-06-05T01:50:14.231883+00:00 app[web.1]:     at FirebaseAppError.FirebaseError [as constructor] (/app/node_modules/firebase-admin/lib/utils/error.js:39:28)
2017-06-05T01:50:14.231884+00:00 app[web.1]:     at new FirebaseAppError (/app/node_modules/firebase-admin/lib/utils/error.js:84:23)
2017-06-05T01:50:14.231885+00:00 app[web.1]:     at new Certificate (/app/node_modules/firebase-admin/lib/auth/credential.js:129:19)
2017-06-05T01:50:14.231886+00:00 app[web.1]:     at new CertCredential (/app/node_modules/firebase-admin/lib/auth/credential.js:195:33)
2017-06-05T01:50:14.231887+00:00 app[web.1]:     at Object.cert (/app/node_modules/firebase-admin/lib/firebase-namespace.js:189:58)
2017-06-05T01:50:14.231887+00:00 app[web.1]:     at Object.<anonymous> (/app/server/firebase/index.js:16:33)
2017-06-05T01:50:14.231888+00:00 app[web.1]:     at Module._compile (module.js:569:30)
2017-06-05T01:50:14.231888+00:00 app[web.1]:     at Object.Module._extensions..js (module.js:580:10)
2017-06-05T01:50:14.231889+00:00 app[web.1]:     at Module.load (module.js:503:32)
2017-06-05T01:50:14.231889+00:00 app[web.1]:     at tryModuleLoad (module.js:466:12)
Run Code Online (Sandbox Code Playgroud)

Fra*_*teo 30

我能够使用我在这里找到的评论建议来解决我的问题.

所以在应用程序的Heroku仪表板上,我将PRIVATE_KEY值设置为双引号:

私钥截图

然后我改变了

private_key: process.env.PRIVATE_KEY

private_key: JSON.parse(process.env.PRIVATE_KEY)

最后通过重新部署git push heroku master,应用程序启动良好.


2018-10-27:上述链接的评论现已消失.但本质上,评论者提到字符串实际上是一个JSON字符串,需要将其解析回来String.