【问题标题】:Using private key in a .env file在 .env 文件中使用私钥
【发布时间】:2019-08-22 21:06:41
【问题描述】:

我在 gatsby .env 文件中有一个多行私钥:

GATSBY_GOOGLE_CLIENT_ID="12345"
GATSBY_GOOGLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nflkdflkdf...\n-----END PRIVATE KEY-----"

在我的 gatsby-config 文件中,我有:

module.exports = {
    resolve: 'gatsby-source-google-sheets',
    options: {
        credentials: {
            "type": "service_account",
            "private_key": process.env.GATSBY_GOOGLE_PRIVATE_KEY,
            "client_id": process.env.GATSBY_GOOGLE_CLIENT_ID
        }
    }
}

client_id 工作正常,因为它只是一个单行字符串,但 private_key 不起作用,大概是因为它是多行。

有没有办法解决这个问题?

谢谢

【问题讨论】:

  • 看起来上面的代码中多了一个{,而缺少,。我已经更正了这些,但我不确定您的原始版本中是否存在同样的错误?

标签: javascript reactjs environment-variables gatsby dotenv


【解决方案1】:

对我有用的解决方案——用 base 64 编码私钥

Step1 - 将密钥转换为 Base 64

// Run this code in a JS file on your Dev Machine.
const privateKey= `-----BEGIN PRIVATE KEY-----\nMIIEvSomeMoreCharacterHererplw==\n-----END PRIVATE KEY-----\n`
const buff = Buffer.from(privateKey).toString('base64');
console.log(buff);

注意:您不需要在项目中提交/包含上述代码。这只是为了生成key的base64字符串。

第 2 步 - 将控制台日志数据复制到 .env 文件

PRIVATE_KEY = 'akgjhakdgjhasgf'

第 3 步 - 使用代码中的密钥

const key = Buffer.from(process.env.PRIVATE_KEY , 'base64').toString('ascii');
// Use key anywhere in your code.

【讨论】:

    【解决方案2】:

    我正在添加一种对我有用的手动方法。 第 1 步:

    echo "PRIVATE_KEY=\"`sed -E 's/$/\\\n/g' my_rsa_2048_priv.pem`\"" >> .env
    

    .env 文件中的密钥将如下所示:

    PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\n
    dasdasdadasdasdasdasdasdasdasdadasdasdadasa\n
    huehuauhhuauhahuauhauahuauhehuehuauheuhahue\n
    -----END RSA PRIVATE KEY-----\n"
    

    第 2 步。在代码中打印值 process.env.PRIVATE_KEY 只会显示第一行:-----BEGIN RSA PRIVATE KEY-----\n。要解决此问题,请将.env 中的变量编辑为一行。像这样:

    PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\ndasdasdadasdasdasdasdasdasdasdadasdasdadasa\nhuehuauhhuauhahuauhauahuauhehuehuauheuhahue\n-----END RSA PRIVATE KEY-----\n"
    

    现在process.env.PRIVATE_KEY会正确输出。

    【讨论】:

    • 我能够读取私钥并将其导出到 env 文件。但我不明白第 2 步是关于什么的。你能解释一下吗?
    • @yogescicak 编辑值以保持在一行中。
    【解决方案3】:

    我有类似的问题,我必须阅读 .pem 文件内容。以下方法对我有用。

    • 将 .pem 内容转换为 base64 格式
    • 将转换后的 base64 内容(这将是单行字符串)放入 .env 文件中
    • 现在将 env 变量解码为原始内容

    【讨论】:

      【解决方案4】:

      原来我的 .env 路径不正确。出于某种原因,其他密钥正在工作,但私钥却没有。

      正确的设置:

      require("dotenv").config({
          path: `./.env.${process.env.NODE_ENV}`,
      });
      const private_key = process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n');
      
      module.exports = {
          resolve: 'gatsby-source-google-sheets',
          options: {
              credentials: {
                  "private_key": private_key,
              }
          }
      }
      
      

      【讨论】:

        【解决方案5】:

        您必须将环境变量加载到 gatsby 中。最简单的方法是使用dotenv

        设置:

        yarn add -D dotenv # or npm install -D dotenv
        

        然后在你的gatsby-config.js:

        require('dotenv').config();
        
        module.exports = {
          plugins: [ ... ]
        }
        

        如果你的文件名不是.env或者你存储在不同的位置,你可以传入一个路径选项:

        require('dotenv').config({
          path: 'path/to/env/file'
        });
        

        【讨论】:

        • 谢谢!我实际上已经有了,但路径是错误的。我不确定为什么其他人在工作,那不是,但修复路径已经解决了问题。
        【解决方案6】:

        您可以使用 string.replace 和下面的正则表达式再次转义 \n 字符:

        "private_key": process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n'),
        

        【讨论】:

        • 我得到:Cannot read property 'replace' of undefined: const private_key = process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n'); module.exports = {...} 可能与在 module.exports 外部声明的 const 有关?
        • 听起来好像超出了您添加该行的范围 - 我已经更新以更接近您的问题。
        • 不幸的是同样的错误。似乎无法在 process.env 上使用 .replace
        • 奇怪 - 它对我有用。你能用调试器检查 GATSBY_GOOGLE_PRIVATE_KEY 肯定有分配给它的字符串吗?
        【解决方案7】:

        放入一个 pem 文件,然后将其替换为您的 .env 文件

        echo "export test_key=\"`sed -E 's/$/\\\n/g' ./gitbu.2018-03-23.private-key.pem`\"" >> .env
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-07
          • 2017-01-04
          • 2018-07-31
          • 1970-01-01
          • 2017-04-10
          • 2020-10-15
          • 2015-12-28
          • 2018-01-31
          相关资源
          最近更新 更多