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

Is there any better way to pass sensitive data to the program, alternative to env variables?

我想使用 npm twitter 包,它 recommends to use env variables, but setting it up on windows machines is horror, so I want to avoid env variables. Next try is keep variables in external json file (like here in my repo),永远不会被提交,但是 它在 CI 上玩得不好,因为如果它不在回购协议中,我该如何使用它并进行测试,对吗?

让我展示一下。

环境变量(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,
});

无法测试的废话

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变量没有废话,最好让代码消费者选择如何传递数据到他的最终产品(正在使用我的库)。所以我们最终得到了没有 "data-passing" 问题的情况。 因为它是可测试的,因为我可以在我的测试中使用环境变量在 Travis CI 中测试它。

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

  1. 要求用户注册自己的 Twitter API 凭据,并在之前将它们添加到项目的配置文件中 运行 项目及其测试。
  2. 如果您尝试使用 像 Travis CI 这样的东西来自动测试任何新的提交,你可能需要 mock your requests 来代替。

选项 #2 可能并不理想,因为它没有考虑到来自 Twitter 的任何未来 API 更改,但是它允许您在假设 API 仍然存在的情况下测试任何提交的破坏稳定。

让您的用户选择最适合他的。实现(或使用库,因为大多数语言都有这样的库)一些东西,可以让你以许多不同的格式传递和隐藏属性:api、文件、环境、命令行。 然后:

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