Heroku 无法将RSA私钥设置为配置变量

Heroku 无法将RSA私钥设置为配置变量,heroku,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_UR

我正在尝试将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=
我最初习惯于设置上述变量,而不是通过Heroku上的仪表板手动设置,但是私钥失败了

然后我尝试通过Heroku仪表板复制/粘贴(不带双引号)手动设置该值,但仍然失败

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

我甚至试着像别人那样用
'\n'
替换
\n
,并用
heroku-config:set-PRIVATE\u-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
}
和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)
2017-06-05T01:50:13.761150+00:00应用程序[web.1]:>NODE_ENV=生产节点。/server/server.prod.js
2017-06-05T01:50:14.231853+00:00应用程序[web.1]:/app/node_modules/firebase admin/lib/auth/credential.js:129
2017-06-05T01:50:14.231876+00:00应用程序[web.1]:抛出新错误\u 1.FirebaseAppError(错误\u 1.AppErrorCodes.INVALID \u凭据,'无法解析私钥:'+错误);
2017-06-05T01:50:14.231877+00:00应用程序[网站1]:^
2017-06-05T01:50:14.231878+00:00应用程序[网站1]:
2017-06-05T01:50:14.231878+00:00应用程序[web.1]:错误:无法解析私钥:错误:PEM格式的消息无效。
2017-06-05T01:50:14.231883+00:00应用程序[web.1]:在FirebaseAppError.FirebaseError[作为构造函数](/app/node_modules/firebase admin/lib/utils/error.js:39:28)
2017-06-05T01:50:14.231884+00:00应用程序[web.1]:在新FirebaseAppError(/app/node_modules/firebase admin/lib/utils/error.js:84:23)
2017-06-05T01:50:14.231885+00:00应用程序[web.1]:在新证书上(/app/node_modules/firebase admin/lib/auth/credential.js:129:19)
2017-06-05T01:50:14.231886+00:00应用程序[web.1]:在新的CertCredential(/app/node_modules/firebase admin/lib/auth/credential.js:195:33)
2017-06-05T01:50:14.231887+00:00应用程序[web.1]:位于Object.cert(/app/node_modules/firebase admin/lib/firebase namespace.js:189:58)
2017-06-05T01:50:14.231887+00:00应用程序[web.1]:at对象。(/app/server/firebase/index.js:16:33)
2017-06-05T01:50:14.231888+00:00应用程序[网站1]:at模块编译(模块js:569:30)
2017-06-05T01:50:14.231888+00:00应用程序[web.1]:at Object.Module.\u extensions..js(Module.js:580:10)
2017-06-05T01:50:14.231889+00:00应用程序[网站1]:at Module.load(Module.js:503:32)
2017-06-05T01:50:14.231889+00:00应用程序[web.1]:在tryModuleLoad(module.js:466:12)

我找到了一条评论建议,可以解决我的问题

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

然后我换了衣服

private\u key:process.env.private\u key

private\u-key:JSON.parse(process.env.private\u-key)

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


2018-10-27:上面链接的评论现在已经不存在了。但本质上,评论者已经提到,该字符串实际上是一个JSON字符串,需要解析回一个JSON字符串


2019-08-01:最初链接的域不再有效。因此,我已将原来的链接替换为Wayback机器中的链接。

您的
中的密钥。env
必须同时包装在一个和两个qoutes中,如下所示:“[私钥]”“这与调用此命令时从heroku获得的格式相同。env
还有一件事要添加到
JSON.parse
,以防它仍然会给您带来一个错误,您可以在这里找到:

因此,从该页面返回后,最后的代码行将如下所示:
JSON.parse(process.env.PRIVATE\u KEY).replace(/\\n/g,'\n')

我在OpenShift中也遇到了同样的问题,您的解决方案成功了!谢谢!呃,非常感谢,我和NextJS和Vercel也有同样的问题