我想将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-cli
到firebase 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环境变量,是否需要考虑这一点?
答案 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,
...
});