在Firebase环境变量中存储googleapi密钥

时间:2018-04-11 21:50:39

标签: node.js firebase security google-cloud-functions secret-key

问题

我想将googleapis的Secret API密钥存储在安全的位置。当我将来自googleapis的Secret API密钥存储为Firebase环境变量时,private_key未经处理与我require("./privatekey.json");时相同,请参阅下面的问题:

上下文

我已从Google下载并解码了一个Secret API密钥。大多数examples显示将已解码的JSON文件保存在项目路径中,并使用require将令牌拉入代码。

const SERVICE_ACCOUNT_KEY_FILE = require("./privatekey.json");  <----- This is Bad!!


const SERVICE_ACCOUNT_EMAIL = 'email@serviceaccount.com';
const jwt = new googleapis.auth.JWT(
        SERVICE_ACCOUNT_EMAIL,
        SERVICE_ACCOUNT_KEY_FILE.private_key,
        null,
        ['https://www.googleapis.com/auth/analytics.readonly']);

我使用了firebase-clifirebase functions:config:set Firebase环境变量。完成并重新部署后,我运行firebase functions:config:get,我看到了:

 "googleapi_credentials": {
    "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIE  ... q0DEg==\\n-----END PRIVATE KEY-----\\n",

问题

配置googleapis.auth.JWT()时,我需要提供googleapis Secret API密钥。当我使用require提取Secret API密钥时,请求可以正常工作。

但是,如果我尝试访问Firebase Environmental Variable以提供Secret API密钥,则请求会失败。

var jwt = new googleapis.auth.JWT(
        functions.config().googleapi_credentials.client_email,
        functions.config().googleapi_credentials.private_key, <----- NOPE!
        null,
        ['https://www.googleapis.com/auth/analytics.readonly']);

调试

要查看我在firebase函数日志视图中比较两个标记的console.log()的不同之处。我存储在JSON文件和Firebase环境变量中的令牌在代码中看起来是相同的,也就是说,两个字符串都匹配,并且它们包含许多\n(换行符)。

现在,当我查看 Firebase功能日志console.log()返回的内容时,我会看到不同的令牌。

console.log("JSON Private.Key", privatekey.private_key)

日志中的视图会返回一个格式化的字符串,其中所有\n都被换行符替换,并且会接受该令牌。

console.log("Private.Key", functions.config().googleapi_credentials.private_key)

日志会返回所有\n替换为\\n的标记,并且不接受该令牌。

最后的注释

googleapis.auth.JWT()函数可以为其参数获取一个对象吗?如果使用Firebase环境变量,是否需要考虑这一点?

2 个答案:

答案 0 :(得分:1)

Firebase环境详细信息存在添加斜杠的问题,并且可能会破坏\n字符串。

GitHub上有一张开放票,应该参考; github.com/firebase/firebase-tools/issues/371

答案 1 :(得分:0)

这是我发现YunjorGlez发布的黑客攻击。这对我有用。

您可以使用 .replace(/ \ n / g,&#39; \ n&#39;)删除要添加到private_key的额外\。< / p>

const serviceAccount = functions.config().fireenv;

admin.initializeApp({
   credential: admin.credential.cert({
      "projectId": serviceAccount.project_id,
      "private_key": serviceAccount.private_key.replace(/\\n/g, '\n'),
      "clientEmail": serviceAccount.client_email
   }),
   databaseURL: whatever,
   ...
});