【问题标题】:Firebase Environmental Config - Added slashes to private_key_idFirebase 环境配置 - 向 private_key_id 添加斜杠
【发布时间】:2018-11-05 20:19:33
【问题描述】:

目标

我正在更新 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",

问题

添加斜线是错误,还是我的用户错误。我应该以不同的方式更新 private_key_id 吗?我该如何解决?

【问题讨论】:

  • 我也试过这个:Silver-Sliver:Issy dchaddportwine$ firebase functions:config:set test.testy="---stuff---\nxyz123\n123xyz\n---end stuff--" 但是,它返回这个:"test": {"testy": "---stuff---\\nxyz123\\n123xyz\\n---end stuff--"},
  • 这可能是更改配置的更好方法:firebase functions:config:set service_account="$(cat service-account.json)"

标签: firebase google-cloud-functions continuous-deployment service-accounts


【解决方案1】:

TLDR:key 的值用单引号括起来,前缀$ 进行特殊处理。

假设 1

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

测试 1

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

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

运行

> node shell-args.js x="Always\nEscape"

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

假设 2

连接并打印文件作为输入会保留 shell 参数。

echo "Always\nEscape" > 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=Always\nEscape' ]

假设 3

当使用 ANSI C 扩展时,换行符被给予特殊处理。

来自man bash

$'string' 形式的单词被特殊处理。该词扩展为 字符串,用反斜杠转义字符替换为 ANSI C 标准...扩展的结果是单引号,就好像美元符号不存在一样。

测试 3

运行

> node shell-args.js x=$'Always\nEscape'

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

结论

key的值用单引号括起来,前缀$进行特殊处理。

【讨论】:

  • 这是从下载的 .json 文件更新 firebase 环境配置的另一种方法:firebase functions:config:set service_account="$(cat service-account.json)"
  • 是的,这也有效。 "$(cat 的简写语法
【解决方案2】:

有一个 bug in the Firebase CLI(自 2017 年开放)导致它在函数配置变量中双重转义换行符。

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

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

【讨论】:

    猜你喜欢
    • 2013-10-08
    • 1970-01-01
    • 2018-06-29
    • 2012-01-12
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2011-04-06
    相关资源
    最近更新 更多