有没有更好的方法将敏感数据传递给程序,替代env变量?

时间:2015-04-26 22:22:01

标签: node.js testing twitter environment-variables

我想使用npm twitter包,它recommends to use env variables,但 setting it up on windows machines is horror ,所以我想避免使用env变量。接下来尝试将变量保存在外部json文件(like here in my repo)中,该文件永远不会被提交,但它与CI 的效果不佳,因为如果它不在repo中,我该如何使用它和测试,对吗?

让我说明一下。

env变量(windows用户的噩梦):

var Twitter = require('twitter');

var client = new Twitter({
  consumer_key: process.env.TWITTER_CONSUMER_KEY,
  consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
  access_token_key: process.env.TWITTER_ACCESS_TOKEN_KEY,
  access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET,
});

untestable crap

var Twitter = require('twitter');
var keys = require('./keys.json');
var client = new Twitter(keys);

.gitignore中使用此行:

keys.json

没有赢家的情况;还有更好的办法吗?

在这种情况下没有赢家,这让我感到难过。 我想实现两个简单的目标:易于消费和可测试性。你能帮助我吗?你怎么处理这个?

更新:我正在谈论基于Twitter API开发开源库,而不是最终用户产品,我觉得在回购邮件中保留令牌是不安全的。

更新2: Windows用户拥有setsetx命令。欢呼!感谢Martin Konecny注意到这一点。

解决方案:虽然在Windows中设置env变量没有废话,最好让代码使用者选择如何将数据传递给他的最终产品(这是使用我的LIB)。所以我们最终得到的情况是没有"数据传递"因为它是可测试的,因为我可以在我的测试中使用env变量在Travis CI中测试它。

2 个答案:

答案 0 :(得分:2)

让您的用户选择最适合他的方式。实现(或使用库,因为有大多数语言的库)可以让你以多种不同的格式传递和影子属性:api,file,envs,命令行。 然后:

  • 在您的本地测试中,您只需使用api作为测试配置的一部分
  • 在集成测试中,您可以放置​​json文件(由git忽略)
  • on travis,您可以使用命令行参数或环境属性
  • 在生产中,您将使用环境属性或带配置的远程服务器

答案 1 :(得分:1)

由于这是一个开源项目,您很可能无法在项目本身中包含您的Twitter API密钥。我看到两个可能的解决方案:

  1. 要求用户注册自己的Twitter API 凭据,然后将这些添加到项目的配置文件中 运行项目及其测试。
  2. 如果您正在尝试使用 像Travis CI这样可以自动测试任何新提交,您可能需要mock your requests
  3. 选项#2可能并不理想,因为它没有考虑来自Twitter的任何未来API更改,但是它允许您在假设API保持稳定的情况下测试任何提交的破坏。