当我将 NodeJS 应用程序推送到 Heroku 时,我收到此错误
firebaseapperror: failed to parse private key: error: invalid pem formatted message
。
我的环境变量都是这样设置的
# .env file
project_id=project_id
private_key='-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n'
client_email=client_email
并像这样访问它们:
export const sa = {
privateKey: process.env.private_key,
projectId: process.env.project_id,
clientEmail: process.env.client_email
};
在我的本地一切工作正常,但在生产(heroku)上我收到了上面提到的错误。私钥是一个多行环境变量,无法解析。
请问我该如何解决这个问题?
修复
我是如何解决这个问题的,是通过我在网上看到的一篇文章:如何在环境变量中存储长的多行私钥
按照步骤操作,您也应该修复此问题。
帖子的简要摘要是这样的:
将长的多行密钥存储为 json 字符串,如下所示:
# .env file
project_id=project_id
private_key='{"privateKey": "-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n"}'
client_email=client_email
然后解析它并解构密钥,如下所示:
const { privateKey } = JSON.parse(process.env.private_key);
export const sa = {
privateKey,
projectId: process.env.project_id,
clientEmail: process.env.client_email
};
这适用于本地,但在生产中(heroku),你会得到一个解析错误,因为在相关键之前和之后都有单引号。因此,请删除生产环境变量中键前后的单引号。我还尝试在本地不使用单引号并且它有效。
额外福利
此方法的额外好处
由此,您甚至可以将整个环境变量存储为一个像这样的对象
# .env file
sa='{"privateKey": "-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n", "clientEmail": "client_email", "projectId": "project_id"}'
然后像这样访问它:
export const sa = JSON.parse(process.env.sa);
就是这样。
提醒:记住我所说的单引号!
JSON.parse(Buffer.from(process.env.CERT, 'base64').toString())
private_key
周围的单/双引号解决了我的情况。您可以在产品环境变量中将私钥设置为:
-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----
不是这个
6","private_key":"-----BEGIN PRIVATE KEY-----\\nMIIEv
应该是这个
6","private_key":"-----BEGIN PRIVATE KEY-----\nMIIEv
会有很多
在 RSA 密钥中,检查更多
"
而不是
'
来存储私钥。.env 文件
project_id=project_id
private_key="-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n"
client_email=client_email