【问题标题】:where to store api keys in express node for HerokuHeroku 在 express 节点中存储 api 密钥的位置
【发布时间】:2017-04-10 02:38:45
【问题描述】:

我正在完成一个 node express 应用程序,其中我有一个用于 Sendgrid 和 Stripe 的 API 密钥,但我不确定如何将这些存储在我将部署在 Heroku 上的应用程序中(还有一些我想存储的其他变量类似于 db 密码等等)。我在网上看到很多人都在使用process.env,所以经过一番查看后,我尝试使用dotenv npm,即使在尝试使用dotenv 作为我的sendgrid 密钥后,应用程序的结构也存在一些问题,但我每次都遇到错误.

我的问题是有人可以提供一些详细的说明或方法来安全地在我将部署到 Heroku 的 node express 应用中存储 API 密钥吗?

附:我按照教程通过 facebook、google 和 linkedIn 为 Oauth2 实现 Passport.js,以便用户可以轻松登录到应用程序。应用程序机密、ID 和回调是从我的应用程序的文件夹调用配置中的 json 文件中检索的。这些信息至少在应用程序中的放置和检索方面是否安全?我应该为我的 sendgrip 和 stripe api 键做类似的事情吗? (下图)

【问题讨论】:

    标签: node.js security express stripe-payments api-key


    【解决方案1】:

    你可以这样设置你的文件夹目录:

    config.js

    var config = {};
    //development
    var env = process.env.NODE_ENV || 'development';
    if(env === 'development'){
      config = require('./env/development');
    }else if (env === 'test'){
        config = require('./env/test');
    } else if(env === 'production'){
        config = require('./env/production');
    }
    
    module.exports = config;
    

    development.js

    var envFile = __dirname + '/env.json';
    var jsonfile = require('jsonfile');
    
    var envVars = jsonfile.readFileSync(envFile);
    
    module.exports = {
        value: envVars["VALUE"] 
    };
    

    production.js

    module.exports = {
        value: process.env.VALUE 
    };
    

    test.js

    module.exports = {
        value: 'Some value' 
    };
    

    这里的基本思想是每个开发者都可以在自己的 env.json 文件中配置自己的密钥。对于生产,您可以将它们存储在某个安全文件中,然后在运行应用程序之前将它们加载到您想要的环境中。使用 heroku,可以轻松配置这些环境变量并为您存储它们。看看here

    您还可以省略任何您可能不需要的细节,例如开发或测试内容。

    编辑:一个例子

    首先从命令行尝试这个以了解正在发生的事情。在这个例子中,我使用的是 linux。如果您正在使用其他任何东西,只需研究如何在您正在使用的命令行中设置环境变量。

    app.js

    var config = require('./config/config');
    //get value from config
    var value = config.value;
    

    从 bash 命令行设置环境变量

    $: VALUE="my value"
    $: NODE_ENV="production"
    $: export VALUE
    $: export NODE_ENV
    

    运行应用程序

    $: node app.js
    

    或者如果你正在使用 npm 脚本

    $: npm start
    

    当您运行应用程序节点时,将自动加载 process.env,并在命令行 shell 中定义每个环境变量。现在,如果您使用的是 heroku,则可以按照我之前在此答案中发布的链接进行操作,而不必设置它们。只需在 heroku 界面中定义它们,它就会为您加载它们。

    【讨论】:

    • 感谢您的快速回复,但我有问题,所有关于确保我知道每一步发生的事情。 1)我假设 process.env.NODE_ENV 将由我设置为 shell 或 Heroku 系统将在我部署时使其“生产”,因此它不会默认为开发,对吗? 2) 您在开发 sn-p 中添加的 envFile 是否包含作为 JSON 的所有 KEY=VALUE 对我的密钥,或者我是否将其放在您放置在底部的 module.exports 部分中,如果那是案例,envFile 中有什么内容?非常抱歉。我也想知道发生了什么...
    • 是的,正确的。是的,它将是标准的 JSON。就像这个{"VALUE" : "some other value"} 一样,仅此而已。没有module.exports。当然,这是特定于我的示例的。你可以使用任何你想要的东西(即从文本文件、yaml、csv 等加载)。基本思想是开发环境应该从你可以放入的文件中加载值,生产环境变量中定义,测试通常是硬编码的。所以,只要你需要,它应该适合你。
    • 明白了。是的,环顾四周,每个人都提到了它,但我没有找到太多明确解释代码的内容。也许我只是没有看。在我把它放到我的项目中之前,我想再问一个问题。在这样做并以这种方式获得我所有的价值观之后,它会安全吗?我不是在这里寻找诺克斯堡,但足以让我掌握基本知识,没有人可以轻易拿走我的钥匙
    • 哦,我应该对原来的 P.S. 进行任何更改吗?我用Passport.js 发布了关于我的 Oauth 的信息,或者这样好吗?
    • 很高兴听到。保重!
    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2023-02-10
    • 2010-11-09
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多