在 Heroku 上隐藏 public 面向 github 的 Twitter 机器人 运行 的 API 关键信息?
Hiding API key info from public facing github for Twitter bot running on Heroku?
我一直在使用一些在线教程自学 node.js。我成功制作了一个 Twitter 机器人并使用 Heroku 部署了它,一切正常。
但是,我的 Twitter API 密钥包含在一个 config.js 文件中,该文件可在我的 Heroku 应用链接到的 github 存储库中免费获得。我已经从 github 中删除了这些敏感数据。
我搜索了这方面的答案,发现了很多相互矛盾和令人困惑的解决方案,希望有人能指导我找到一个易于遵循的解决方案。如果我的 API 密钥在 git 上不可用,我应该将它们存储在哪里以及如何指示我的应用程序检索它们?
这是主要的 app.js 文件,请注意,我结合了几个不同的教程,所以它的作用是在屏幕上提供 "Hello World" 输出以及推文 "Hello, learning node.js!"在我选择的 Twitter 帐户上:
const http = require('http');
const port=process.env.PORT || 3000
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/html');
res.end('<h1>Hello World</h1>');
});
server.listen(port,() => {
console.log(`Server running at port `+port);
});
var Twit = require('twit')
var fs = require('fs'),
path = require('path'),
Twit = require('twit'),
config = require(path.join(__dirname, 'config.js'));
var T = new Twit(config);
T.post('statuses/update', { status: 'Hello, learning node.js!' },
function(err, data, response) {
console.log(data)
});
上面引用的 config.js 文件如下所示:
var config = {
consumer_key: 'xxx',
consumer_secret: 'xxx',
access_token: 'xxx',
access_token_secret: 'xxx'
}
module.exports = config;
这一切都适用于 config.js 文件中的正确密钥,但显然这在安全方面并不理想!
如您所知,我在这里有点新手,但很想了解解决此问题的正确方法。非常感谢!
Heroku 让你设置一些环境变量,更多细节here,你可以通过 process.env.MY_ENV_VAR
.
获取它们
这是构建引用 Twelve-Factor App 的应用程序的推荐方法。
我不太了解 heroku,但我想你可以设置环境变量。
要在您的开发机器中访问这些变量,您可以在 .env 文件中或直接在您的计算机环境变量中设置它们。如果您想使用 .env
文件,那么我想您将需要 npm dotenv module(并且显然将 .env
添加到您的 .gitignore
)。
对于您的示例,您可以拥有以下 .env
文件:
#!/usr/bin/env bash
consumer_key= 'xxx',
consumer_secret= 'xxx',
access_token= 'xxx',
access_token_secret='xxx'
然后你可以将它们与 process.env.VAR_NAME
一起使用,所以如果你想要消费者密钥,你可以 process.env.consumer_key
。通常这些变量被命名为大写 tho.
它也常用于设置一个 NODE_ENV
变量,它允许您确定您是否在 development
、production
、test
中 运行。 ..模式
谢谢。我在 Heroku 上添加了环境变量(通过桌面,不使用 CLI),然后将我的 config.js 文件更改为:
var config = {
consumer_key: process.env.consumer_key,
consumer_secret: process.env.consumer_secret,
access_token: process.env.access_token,
access_token_secret: process.env.access_token_secret
}
module.exports = config;
我一直在使用一些在线教程自学 node.js。我成功制作了一个 Twitter 机器人并使用 Heroku 部署了它,一切正常。
但是,我的 Twitter API 密钥包含在一个 config.js 文件中,该文件可在我的 Heroku 应用链接到的 github 存储库中免费获得。我已经从 github 中删除了这些敏感数据。
我搜索了这方面的答案,发现了很多相互矛盾和令人困惑的解决方案,希望有人能指导我找到一个易于遵循的解决方案。如果我的 API 密钥在 git 上不可用,我应该将它们存储在哪里以及如何指示我的应用程序检索它们?
这是主要的 app.js 文件,请注意,我结合了几个不同的教程,所以它的作用是在屏幕上提供 "Hello World" 输出以及推文 "Hello, learning node.js!"在我选择的 Twitter 帐户上:
const http = require('http');
const port=process.env.PORT || 3000
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/html');
res.end('<h1>Hello World</h1>');
});
server.listen(port,() => {
console.log(`Server running at port `+port);
});
var Twit = require('twit')
var fs = require('fs'),
path = require('path'),
Twit = require('twit'),
config = require(path.join(__dirname, 'config.js'));
var T = new Twit(config);
T.post('statuses/update', { status: 'Hello, learning node.js!' },
function(err, data, response) {
console.log(data)
});
上面引用的 config.js 文件如下所示:
var config = {
consumer_key: 'xxx',
consumer_secret: 'xxx',
access_token: 'xxx',
access_token_secret: 'xxx'
}
module.exports = config;
这一切都适用于 config.js 文件中的正确密钥,但显然这在安全方面并不理想!
如您所知,我在这里有点新手,但很想了解解决此问题的正确方法。非常感谢!
Heroku 让你设置一些环境变量,更多细节here,你可以通过 process.env.MY_ENV_VAR
.
获取它们
这是构建引用 Twelve-Factor App 的应用程序的推荐方法。
我不太了解 heroku,但我想你可以设置环境变量。
要在您的开发机器中访问这些变量,您可以在 .env 文件中或直接在您的计算机环境变量中设置它们。如果您想使用 .env
文件,那么我想您将需要 npm dotenv module(并且显然将 .env
添加到您的 .gitignore
)。
对于您的示例,您可以拥有以下 .env
文件:
#!/usr/bin/env bash
consumer_key= 'xxx',
consumer_secret= 'xxx',
access_token= 'xxx',
access_token_secret='xxx'
然后你可以将它们与 process.env.VAR_NAME
一起使用,所以如果你想要消费者密钥,你可以 process.env.consumer_key
。通常这些变量被命名为大写 tho.
它也常用于设置一个 NODE_ENV
变量,它允许您确定您是否在 development
、production
、test
中 运行。 ..模式
谢谢。我在 Heroku 上添加了环境变量(通过桌面,不使用 CLI),然后将我的 config.js 文件更改为:
var config = {
consumer_key: process.env.consumer_key,
consumer_secret: process.env.consumer_secret,
access_token: process.env.access_token,
access_token_secret: process.env.access_token_secret
}
module.exports = config;