在 MEAN Stack 中存储 API 个键
Storing API keys in MEAN Stack
寻找(安全地)存储 Google 的最佳方法将 API 密钥放入 MEAN 堆栈中。我打算使用 .env 文件,但我不确定如何着手实现它。我当前的解决方案是快速拉入 .env 变量,但我不确定从那里采取什么路线将密钥插入脚本标签。我无法从 angular 中找到任何关于如何为此使用模板的信息,所以我得出结论,我将不得不使用另一个模板库,如 handlebars。我真的不喜欢这种方法,还有其他 'best practices' 方法可以解决这个问题吗?
我推荐使用模块 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();
});
});
我假设您使用的是 Google 所指的 'Browser key'。但是,如果您使用的是 'Server key',那么您无论如何都不应该将密钥传递给您的客户端代码。
如果您使用 Express response.render() 生成 HTML,您可以将 API 键作为本地传递到 res.render,并引用它在您的 HTML 或模板中。
以下是我使用 Express 渲染的 jade 模板的片段,它与条纹 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,这将允许你使用 'pure' 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
听起来您已经在处理下方 link 中 'Best practices for securely using API keys' 下的其他最佳做法列表,但请特别确保您遵循了有关通过引荐来源限制访问的指南 URL。
https://developers.google.com/console/help/new/
祝你好运!
- 蒂姆
寻找(安全地)存储 Google 的最佳方法将 API 密钥放入 MEAN 堆栈中。我打算使用 .env 文件,但我不确定如何着手实现它。我当前的解决方案是快速拉入 .env 变量,但我不确定从那里采取什么路线将密钥插入脚本标签。我无法从 angular 中找到任何关于如何为此使用模板的信息,所以我得出结论,我将不得不使用另一个模板库,如 handlebars。我真的不喜欢这种方法,还有其他 'best practices' 方法可以解决这个问题吗?
我推荐使用模块 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();
});
});
我假设您使用的是 Google 所指的 'Browser key'。但是,如果您使用的是 'Server key',那么您无论如何都不应该将密钥传递给您的客户端代码。
如果您使用 Express response.render() 生成 HTML,您可以将 API 键作为本地传递到 res.render,并引用它在您的 HTML 或模板中。
以下是我使用 Express 渲染的 jade 模板的片段,它与条纹 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,这将允许你使用 'pure' 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
听起来您已经在处理下方 link 中 'Best practices for securely using API keys' 下的其他最佳做法列表,但请特别确保您遵循了有关通过引荐来源限制访问的指南 URL。
https://developers.google.com/console/help/new/
祝你好运!
- 蒂姆