如何使用Python Keyring获取用户名?

9

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

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

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

是否有类似的函数可以检索用户名?

5个回答

12

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

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

请注意,在macOS上这是无法实现的,keyring后端没有搜索条目的功能——也就是说,您需要知道用户名。尽管如此,我想本地代码可能允许您这样做,请参见官方文档


2
值得一提的是,您可以通过 c.usernamec.password 这样的方式访问用户名和密码。 - Felix Zumstein
这是最准确的答案。 - d0m1n0
值得指出的是,get_credential 函数从 Keyring 15.2.0 版本开始提供。 - Stevoisiak

9
更新:从Keyring 15.2.0开始,您可以使用keyring.get_credential代替。
虽然 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 WyattAlex Chan提供这个解决方案。


密钥(而非密码)是否安全地存储在钥匙串中,或者这种“配对”解决方案是否会暴露用户名? - DylanYoung

7
你应该已经在其他地方存储了用户名。
钥匙链仅按应用程序名称和用户名为关键字存储密码。

3

您可以使用 keyring 15.2.0 中添加的 get_credential 函数来检索用户名。

import keyring

keyring.set_password("example_service", "example_username", "example_password")
credentials = keyring.get_credential("example_service", None)
if credentials is not None:
    username = credentials.username  # example_username
    password = credentials.password  # example_password

感谢MShekowEelco van Villet提供了类似的答案


2
如果您想在脚本中隐藏用户名,您可以使用keyring模块的凭据。此外,我建议使用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

如果登录成功,下次就不必再输入用户名和密码。


这个回答非常优雅! - Sash7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接