在MEAN Stack中存储API密钥



寻找在MEAN堆栈中存储(安全)Google Places API密钥的最佳方法。我打算使用。env文件,但我不确定如何去实现这一点。我目前的解决方案是在。env变量中有快速拉,但我不确定从那里采取什么路线将密钥插入脚本标签。我找不到任何关于如何使用模板的内容,所以我得出结论,我必须使用另一个模板库,如handlebars。我真的不喜欢这种方法,有没有其他的"最佳实践"方法来解决这个问题?

我建议使用node-env-file模块。这就是我在我的项目中使用的方法,我对此非常满意。它的设置非常简单(查看他们的文档),并且非常有效。它从.env文件中读取变量,并将它们嵌入到Node项目中。

  • .env

    # your environment variables
    API_KEY1=abcd123
    
  • app.js

    var env = require('node-env-file');
    var API_KEY1 = process.env.API_KEY1;
    

我在我的一个项目中做了以下操作-它适用于我的nodemon开发环境。我通过配置变量在Heroku中存储相同的数据,以便不必在我的存储库中包含键。

// loads confidential parameters to inject into process.env
var googlekey = fs.readFileSync("./ignored/privatekey.pem", "utf8");
var config    = require("./server/config/local.env");
config.PRIVATE_KEY = googlekey;
//run server using nodemon
gulp.task('serve', function(){
    return nodemon({
        script: 'index.js',
        watch: 'server/',
        // ignore: ['app/**/*', 'dist/*', 'node_modules/*'],
        env: config
    })
    .on('start', function () {
        // done();
    });
});

我假设你正在使用谷歌所说的"浏览器键"。但是,如果您使用的是"服务器密钥",那么无论如何都不应该将密钥传递给客户端代码。

如果你使用Express response.render()来生成HTML,你可以将API密钥作为本地传递给res.render,并在HTML或模板中引用它。

下面是我用Express渲染的jade模板的一个片段,它与Stripe API做了类似的事情:

extends layout
block head-content
  script(src='https://js.stripe.com/v2/')
  script.
    // <![CDATA[
    Stripe.setPublishableKey('#{stripePublicKey}');
    // ]]>

听起来像是将键存储在环境变量中,因此可以这样将它传递给Express呈现引擎:

res.render('index', {stripePublicKey: process.env.STRIPE_PUBLIC_KEY});

听起来你也想避免使用jade或其他模板引擎,所以你可以使用EJS,这将允许你使用"纯"HTML,但有变量。这里有一个很好的入门教程:

http://robdodson.me/how-to-use-ejs-in-express/

如果您已经有了大量的内容,并且您不想为了获得传入的一个变量而将所有现有的.html文件重命名为.ejs,您可以这样做:

app.engine('html', require('ejs').renderFile);

在这里更详细地描述:

http://expressjs.com/api.html app.engine

听起来你已经在下面链接的"安全使用API密钥的最佳实践"下的其他最佳实践列表上工作了,但要确保你特别遵循关于限制引用URL访问的指导。

https://developers.google.com/console/help/new/

祝你好运!
    蒂姆

相关内容

  • 没有找到相关文章

最新更新