Firebaseapperror:无法解析私钥:错误:pem 格式的消息无效

Jus*_*ice 4 parsing environment-variables multiline node.js firebase-admin

firebaseapperror: failed to parse private key: error: invalid pem formatted message当我将 Nodejs 应用程序推送到 Heroku 时,出现此错误。

我的环境变量都是这样设置的

# .env file
    
project_id=project_id
private_key='-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n'
client_email=client_email
Run Code Online (Sandbox Code Playgroud)

并像这样访问它们:

export const sa = {
    privateKey: process.env.private_key,
    projectId: process.env.project_id,
    clientEmail: process.env.client_email
};
Run Code Online (Sandbox Code Playgroud)

在我的本地一切工作正常,但在生产(heroku)我得到了上面提到的错误。私钥是一个多行环境变量,无法解析。

请问我该如何解决这个问题?

Jus*_*ice 15

修复方法

我是如何解决这个问题的,是通过我在网上看到的一篇文章:How to Store a Long, Multi-line Private Key in an Environment Variable

按照步骤操作,您也应该修复此问题。

这篇文章的简短摘要是这样的:

将长的多行密钥存储为 json 字符串,如下所示:

# .env file

project_id=project_id
private_key='{"privateKey": "-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n"}'
client_email=client_email
Run Code Online (Sandbox Code Playgroud)

然后解析它并解构密钥,如下所示:

const { privateKey } = JSON.parse(process.env.private_key);

export const sa = {
    privateKey,
    projectId: process.env.project_id,
    clientEmail: process.env.client_email
};
Run Code Online (Sandbox Code Playgroud)

这在本地可以工作,但在生产(heroku)上,你会得到一个解析错误,因为有问题的键之前和之后的单引号。因此,请删除生产环境变量中键前后的单引号。我也尝试过在本地不使用单引号,并且它有效

额外优惠

这种方法的额外好处

由此,您甚至可以将整个环境变量存储为一个对象,如下所示

# .env file

sa='{"privateKey": "-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n", "clientEmail": "client_email", "projectId": "project_id"}'
Run Code Online (Sandbox Code Playgroud)

然后像这样访问它:

export const sa = JSON.parse(process.env.sa);
Run Code Online (Sandbox Code Playgroud)

就是这样。

提醒:记住我所说的单引号