【问题标题】:Alternative to attempting to persist Environment Variables in Python尝试在 Python 中持久化环境变量的替代方法
【发布时间】:2020-06-17 11:30:23
【问题描述】:

到目前为止,每当我需要为简单的 python 应用程序存储“秘密”时,我都依赖于环境变量。在 Windows 中,我通过计算机属性对话框设置变量,然后在我的 Python 代码中访问它们,如下所示:

database_password = os.environ['DB_PASS']

这种方法的简单性对我很有帮助。现在我有一个使用 Oauth2 身份验证的项目,我需要将令牌存储到可能在整个程序执行过程中发生变化的环境中。我希望它们在我下次执行程序时持续存在。这是我想出的:

#fetch a new token
token = oauth.fetch_token('https://api.example.com/oauth/v2/token', code=secretcode)
access_token = token['access_token']

#make sure it persists in the current session
os.environ['TOKEN'] = access_token

#store to the system environment (Windows)
cmd = 'SETX /M TOKEN ' + access_token
os.system(cmd)

今天它为我快速完成了工作,但似乎不是添加到我的工具箱的正确方法。有没有人有一种更优雅的方式来做我想做的事情,不会增加太多的复杂性?如果解决方案跨平台工作,那将是一个奖励。

【问题讨论】:

  • 我发现使用 json 文件来存储您的令牌或密码很容易。如果您有 20 个不同的令牌或数据库密码,那么您将拥有那么多环境变量。但是使用 josn,您将拥有一个很好的字典结构,您可以在其中正确并相应地命名您的键。只需读取 json 并检索数据。 json文件的读写不要太复杂
  • 您可以考虑使用temporary filesRegistry(当然仅限Windows)。
  • @Buckeye14Guy 谢谢。您是否以任何方式加密文件或其中的变量?
  • 是的,我只是使用密码学模块来加密我的东西。我生成了一个密钥,该密钥可以存储在任何地方,甚至可以作为环境变量存储。一把钥匙虽然不太安全,但还是很安全的。

标签: python oauth environment-variables access-token


【解决方案1】:

我已经成功使用了 Python keyring 模块。它是操作系统(例如 Windows 凭据管理器)提供的凭据库的接口。我没有在 Linux 上使用它,但它似乎也受支持。

存储密码/令牌然后检索它可以很简单:

import keyring
keyring.set_password("system", "username", "password")
keyring.get_password("system", "username")

【讨论】:

  • 您知道是否可以在计算机之间传输凭据吗?
  • @ricoflow,你能详细说明你的用例吗? keyring 中似乎没有任何用于在多台机器之间同步凭据的内容。
  • 我通常会在我的电脑上开发一个 python 脚本。当它准备好在另一个用户的机器或服务器上进行测试时,我会将它推送到 GitHub。当我在目标机器上拉下代码时,我只需要担心手动更新任何数据库连接的环境变量等。看起来 Windows 凭据管理器可以从一台机器导出/导入到另一台机器,但是从什么我读过它似乎不能在每个密码的基础上移动密码,只能作为整个集合。
  • 是的,看起来本机 Windows 功能仅提供批量导出/导入功能。 keyring 模块可用于有选择地从开发机器上的 Windows Credential Locker 中提取凭据,然后(在文件传输后)服务器上的另一个 Python 脚本可以使用 keyring将这些密码插入服务器的 Credential Locker。
  • 或者,有一个第三方后端可用的密钥环称为keyrings.cryptfile。大概它将您所有的密钥环凭据保存在一个文件中。 可能能够将该cryptfile文件复制到服务器。
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
相关资源
最近更新 更多