Netlify上环境变量中的JSON

时间:2019-03-08 08:26:32

标签: git firebase deployment environment-variables netlify

我正在构建使用ServiceAccountKey.json进行Firebase身份验证的AWS Lambda函数。部署到Netlify时,我不想在git repo中公开此数据。有没有办法将整个JSON保存为环境变量

JSON in environmental variable

Environmental variables on Netlify

3 个答案:

答案 0 :(得分:2)

免责声明:我为Netlify的支持团队工作。

虽然先前的建议是可以将JSON用作没有嵌入回车符的字符串,但可能的做法是,让环境变量包含引号可能有点挑战,我见过的所有非平凡JSON都会使用它。有两种不同的建议可以做到这一点:

  1. 改为使用占位符创建字符串,并在构建过程中用引号将占位符替换。在此示例中,我使用@字符,因此您的“ JSON”看起来像{@type@: @service_account...,然后您可以在构建中使用类似的内容:

echo -e "${JSON_VARIABLE//@/\"}" > file.json && do_your_normal_build

  1. 您还可以创建一个函数(在此处为文档https://www.netlify.com/docs/functions/),以返回该函数,并且在需要时甚至可以提供合理的Content-Type HTTP响应标头。

答案 1 :(得分:1)

如果我没看错,您可以将json作为简单字符串存储在env var中。 否则,请看一下jq,它允许您运行以从文件中读取json并将其直接存储在env var中。

此致

答案 2 :(得分:0)

除非您将netlify函数用作下面提到的@fool,否则Netlify不会为您保存JSON文件。但是您也不应该将带有env变量的json文件保存到Git中。因此,最好的方法是将json文件中的数据转换为对象并使用该对象:

  • 将JSON中的数据转换为对象。
  • 我们的新对象可以使用.env变量,(您还需要dotenv以防万一)
  • 直接将对象(例如serviceAccount)注入需要它的函数中。
  • 执行上述步骤时遇到的秘密错误是.env变量之一,其中的“ \ n”变成字符串时变成“ \\ n”->错误消息并没有真正告诉您这是问题所在。
  • 因此您需要将其添加到变量.replace(/\\n/g, '\n')
  • 对于开发,您拥有.env文件
  • 对于生产,您只需在netlify内通常一个接一个地添加env变量即可。

以下是我的对象:

require('dotenv').config();

module.exports = {
FIREBASE_KEY: {
    type: process.env.REACT_APP_SAK_TYPE,
    project_id: process.env.REACT_APP_SAK_PROJECT_ID,
    private_key_id: process.env.REACT_APP_SAK_PRIVATE_KEY_ID,
    private_key: process.env.REACT_APP_SAK_PRIVATE_KEY.replace(/\\n/g, '\n'),
    client_email: process.env.REACT_APP_SAK_CLIENT_EMAIL,
    client_id: process.env.REACT_APP_SAK_CLIENT_ID,
    auth_uri: process.env.REACT_APP_SAK_AUTH_URI,
    token_uri: process.env.REACT_APP_SAK_TOKEN_URI,
    auth_provider_x509_cert_url: process.env.REACT_APP_SAK_AUTH_PROVIDER_X509_CERT_URL,
    client_x509_cert_url: process.env.REACT_APP_SAK_X509_CERT_URL,
},
FIREBASE_DB: process.env.REACT_APP_FB_DATABASE_URL,
};

以及使用这些键的相应功能:

const config = require('./config');
const serviceAccount = config.FIREBASE_KEY;
firebaseAdmin.initializeApp({ credential: firebaseAdmin.credential.cert(serviceAccount), databaseURL: config.FIREBASE_DB,});