如何使用Python密钥环检索用户名?

时间:2013-03-05 22:10:54

标签: python windows python-keyring

我的Windows 7机器上有一个Mercurial密钥环。我正在使用Python keyring库从Mercurial密钥环获取用户凭据。

我可以使用以下命令检索给定用户名的密码:

keyring.get_password('Mercurial', 'user@@etc')

是否有类似的功能来检索用户名?

4 个答案:

答案 0 :(得分:3)

虽然keyring仅用于存储密码,但您可以滥用get_password分别存储用户名。

import keyring

# store username & password
keyring.set_password("name_of_app", "username", "user123")
keyring.set_password("name_of_app", "password", "pass123")

# retrieve username & password
username = keyring.get_password("name_of_app", "username")
password = keyring.get_password("name_of_app", "password")

或者,如果您想保持用户名与密码配对:

import keyring

service_id = "name_of_app"
username = "user123"

# store username & password
keyring.set_password(service_id, "username", username)
keyring.set_password(service_id, username, "pass123")

# retrieve username & password
username = keyring.get_password(service_id, "username")
password = keyring.get_password(service_id, username)

归功于Dustin Wyatt&这个解决方案Alex Chan

答案 1 :(得分:2)

您需要将用户名存储在其他位置。

密钥环仅存储密码,密码由应用程序名称和用户名组成。

答案 2 :(得分:0)

在Windows上,我可以使用来获取用户名和密码(即“凭据”)

c = keyring.get_credential("servicename", None)

请注意,这不适用于macOS,keyring后端没有搜索条目的功能-即,您需要知道用户名。我想本机代码将允许您执行此操作,请参阅official docs

答案 3 :(得分:0)

如果您也想在脚本中隐藏用户名,则可以使用密钥环模块的凭据。另外,我建议使用getpass库输入密码。这样可以防止将密码打印到屏幕上。最后,一旦您注意到登录失败,您可能希望在代码中的某处具有删除凭据。否则,脚本将重新启动,而不会提示用户。举一个完整的例子。这是检索用户名和密码的方法

import getpass
import keyring
import requests

service_name = "Name of the keyring"
credentials = keyring.get_credential(service_name, None)
if credentials is None:
    username = input("Username: ")
    password = getpass.getpass()
    keyring.set_password(service_name,username, password)
else:
    username = credentials.username
    password = credentials.password

然后,您可以执行您的操作,例如使用对api的请求进行发布。如果失败,请删除密钥环以强制再次询问证书。

response = requests.post('url_to_api', auth=requests.auth.HTTPBasicAuth(username, password))
try:
    response.raise_for_status()
except requests.exceptions.HTTPError as err:
    keyring.delete_password(service_name, username)
    raise

如果登录成功,则下次无需再次输入用户名和密码。