我正在尝试将Express应用程序部署到Heroku。我遇到的麻烦是Heroku或其他方面的东西搞砸了RSA私钥字符串的格式。我在我的hadoop fs -chmod 777 /user
中有以下内容,它在本地工作,并且不在git中:
.env
我最初使用https://github.com/xavdid/heroku-config来设置上述变量,而不是通过Heroku上的仪表板手动执行,但该私钥失败。
然后我尝试通过Heroku Dashboard通过复制/粘贴(不带双引号)手动设置该值,但仍然失败。
最后我通过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 config:set
替换为\n
,因为有人here并使用'\n'
引号,但仍无效。
所以我的问题是,Heroku是否用长串值做了一些时髦的东西?或者我错过了什么。调用/使用上述值,如下所示:
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
}
答案 0 :(得分:28)
我能够使用我发现here的评论建议来解决我的问题。
因此,在应用程序的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
。
答案 1 :(得分:1)
您的.env
中的密钥必须像这样
'"[PRIVATE_KEY]"'
同时包裹在一个和两个qout中,这实际上与您调用heroku时得到的格式相同命令
$ heroku config:get PRIVATE_KEY -s >> .env
要在JSON.parse
中添加更多内容,以防万一,您仍然可以在这里找到错误:
Node.js -Firebase Service Account Private Key won't parse
因此,从该页面返回后,最终代码行将如下所示:
JSON.parse(process.env.PRIVATE_KEY).replace(/\\n/g, '\n')