6

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

我可以通过以下方式检索给定用户名的密码:

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

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

4

4 回答 4

9

虽然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的解决方案。

于 2018-02-16T16:39:46.323 回答
7

您应该将用户名存储在其他地方。

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

于 2013-03-05T22:13:06.010 回答
7

在 Windows 上,我能够使用获得用户名和密码(即“凭据”)

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

请注意,这在 macOS 上不起作用,keyring后端没有搜索条目的功能 - 即您需要知道用户名。不过,我想本机代码可以让你这样做,请参阅官方文档

于 2019-01-08T12:25:03.457 回答
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

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

于 2020-10-07T10:11:45.543 回答