寻找在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/祝你好运!- 蒂姆