Firebase环境配置-在private_key_id中添加斜杠



目标

我正在更新service_account密钥,并将它们存储为Firebase环境变量。

错误

当我运行firebase deploy --only functions时,我看到:

Silver-Sliver:Issy dchaddportwine$ firebase deploy --only functions
=== Deploying to 'development-is'...
i  deploying functions
i  functions: ensuring necessary APIs are enabled...
✔  functions: all necessary APIs are enabled
i  functions: preparing functions directory for uploading...
Error: Error occurred while parsing your function triggers.
Error: Failed to parse private key: Error: Invalid PEM formatted message.

问题

使用firebase functions:config:set进行更新会为字符串引入额外的字符。这是我在将:set应用于private_key_id之后在终端中看到的。请参阅额外的反斜杠,其中n变为\n

Silver-Sliver:Issy dchaddportwine$ firebase functions:config:set service_account.private_key_id="-----BEGIN PRIVATE KEY-----nMIIE...L5A==n-----END PRIVATE KEY-----n"
✔  Functions config updated.
Please deploy your functions for the change to take effect by running firebase deploy --only functions
Silver-Sliver:Issy dchaddportwine$ firebase functions:config:get
{
"service_account": {
"private_key_id": "-----BEGIN PRIVATE KEY-----\nMIIE...L5A==\n-----END PRIVATE KEY-----\n",

问题

这个斜杠的添加是一个bug,还是我的用户错误。我应该以不同的方式更新private_key_id吗?我该如何解决此问题?

TLDR:将键的值用单引号括起来,并以$作为前缀进行特殊处理。

假设1

新行的转义是由shell程序完成的。

测试1

创建一个脚本,记录shell中解析的参数。

> echo "console.log(process.argv)" > shell-args.js

运行

> node shell-args.js x="AlwaysnEscape"
[ '/Users/alẹ́tilẹ́/.nvm/versions/node/v9.10.1/bin/node',
'/Users/alẹ́tilẹ́/Tests/shell-args.js',
'x=Always\nEscape' ]

假设2

将文件连接并打印为输入会使shell参数保持原样。

echo "AlwaysnEscape" > always_escape

测试2

运行

> node shell-args.js x="$(< always_escape)"

> node shell-args.js x="`< always_escape`"
[ '/Users/alẹ́tilẹ́/.nvm/versions/node/v9.10.1/bin/node',
'/Users/alẹ́tilẹ́/Tests/shell-args.js',
'x=AlwaysnEscape' ]

假设3

当使用ANSI C扩展时,新线会得到特殊处理。

来自man bash

$'sring'形式的单词受到特殊处理。单词扩展为字符串,其中反斜杠转义字符由ANSI C标准展开后的结果是单引号的,就好像美元符号不存在一样

测试3

运行

> node shell-args.js x=$'AlwaysnEscape'
[ '/Users/alẹ́tilẹ́/.nvm/versions/node/v9.10.1/bin/node',
'/Users/alẹ́tilẹ́/Tests/shell-args.js',
'x=AlwaysnEscape' ]

结论

将键的值用单引号括起来,并以$作为前缀进行特殊处理。

Firebase CLI(自2017年开放(中存在一个错误,导致它对函数配置变量中的换行符进行双转义。

最简单的解决方法是在访问配置变量时简单地替换它们

const doubleEscapedValue = functions.config().service_account.private_key_id;
const correctResult = value.replace(/\n/g, 'n');

最新更新