使用 firebase privateKey 作为 Heroku 配置变量的转义问题
Posted
技术标签:
【中文标题】使用 firebase privateKey 作为 Heroku 配置变量的转义问题【英文标题】:Escaping issue with firebase privateKey as a Heroku config variable 【发布时间】:2017-01-22 09:16:42 【问题描述】:我正在尝试创建一个 Heroku 节点任务,该任务从 Firebase 读取数据并对其进行控制台记录。
我的节点脚本(位于 /bin 目录内)是:
require('dotenv').config( silent: true );
var firebase = require('firebase');
firebase.initializeApp(
serviceAccount:
projectId: process.env.fb_projectId,
clientEmail: process.env.fb_clientEmail,
privateKey: process.env.fb_privateKey
,
databaseURL: process.env.fb_databaseURL
)
console.log(process.env.fb_privateKey);
firebase.database().ref('tasks').once('value', function(snapshot)
console.log(snapshot.val());
process.exit();
)
所有环境变量都是正确的,除了fb_privateKey
,因为它包含\n
字符。
我的本地 .env
文件和 Heroku 环境变量都包含一个名为 fb_privateKey
的键和一个带有 \n
字符的字符串形式的值 - 用 "
包围。
fb_privateKey="-----BEGIN PRIVATE KEY-----\nMY-PRIVATE-KEY\n-----END PRIVATE KEY-----\n"
当我在本地运行脚本时,它会记录带有新行的私钥 + 从 Firebase 返回的任务。但是,当我在 Heroku 上运行它时,(heroku run myScript
) 会记录我带有 \n
字符的私钥(作为单行),并且无法从 Firebase 读取数据(可能是由于私钥错误)。有什么想法吗?
【问题讨论】:
您应该将 Erem 的答案标记为正确。 【参考方案1】:我今天也遇到了同样的问题。您需要通过将\\n
字符替换为\n
来清理读取的私钥。
admin.initializeApp(
credential: admin.credential.cert(
"projectId": process.env.FIREBASE_PROJECT_ID,
"private_key": process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n'),
"clientEmail": process.env.FIREBASE_CLIENT_EMAIL,
),
databaseURL: process.env.FIREBASE_DATABASE_URL,
);
【讨论】:
这个解决方案让我可以在 Vercel 中使用 Firebase 私钥。 在 Netlify 环境变量中使用私钥为我工作:) 在将 NextJs 应用程序部署到 AWS Amplify 时,此解决方案对我有用。 适用于自动编码【参考方案2】:我通过在私钥上使用 .replace(/\n/g, '\n') 并从 heroku config vars 上的私钥值中删除引号来解决这个问题,如下所示。
-----BEGIN PRIVATE KEY-----\nMY-PRIVATE-KEY\n-----END PRIVATE KEY-----\n
【讨论】:
【参考方案3】:在我的例子中,我通过将 FIREBASE_PRIVATE_KEY 转换为 base64 字符串来解决它,然后我将这个新字符串保存为 Heroku 中的环境变量。在我的代码中,我再次将 base64 FIREBASE_PRIVATE_KEY 转换为原始私钥。
const firebase_private_key_b64 = Buffer.from(process.env.FIREBASE_PRIVATE_KEY_BASE64, 'base64');
const firebase_private_key = firebase_private_key_b64.toString('utf8');
admin.initializeApp(
credential: admin.credential.cert(
"project_id": process.env.FIREBASE_PROJECT_ID,
"private_key": firebase_private_key,
"client_email": process.env.FIREBASE_CLIENT_EMAIL,
),
databaseURL: process.env.FIREBASE_DATABASE_URL
);
【讨论】:
最佳解决方案,很好解释。与 Netlify 一起使用。以上是关于使用 firebase privateKey 作为 Heroku 配置变量的转义问题的主要内容,如果未能解决你的问题,请参考以下文章
Azure Api 管理 ValidateJWT 与 Rs256 PrivateKey
我可以使用 Firebase 动态链接作为 URL 缩短器吗?
如何将 Byte 数组转换为 PrivateKey 或 PublicKey 类型?