Как получить имя пользователя с помощью набора ключей Python?

У меня на компьютере Windows 7 есть брелоки Mercurial. Я использую питон keyring библиотека для получения учетных данных пользователя из набора ключей Mercurial.

Я могу получить пароль для данного имени пользователя с помощью:

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

Есть ли подобная функция для получения имени пользователя?

5 ответов

Решение

Ожидается, что вы сохранили имя пользователя в другом месте.

Брелок хранит только пароль, введенный по имени приложения и имени пользователя.

В Windows я смог получить имя пользователя и пароль (то есть "учетные данные"), используя

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

Обратите внимание, что это не работает на MacOS, keyring Бэкэнд не имеет возможности поиска записей - т.е. вам необходимо знать имя пользователя. Я полагаю, что нативный код позволит вам сделать это, хотя, смотрите официальные документы

В то время как 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"
password = "pass123"

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

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

Благодарим Дастина Уайетта и Алекса Чана за это решение.

Вы можете получить имя пользователя с помощьюget_credentialфункция добавлена ​​в брелок 15.2.0 .

      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

Благодарим MShekow и Eelco van Vilet за аналогичный ответ.

Если вы хотите скрыть свое имя пользователя в сценарии, вы также можете использовать учетные данные модуля связки ключей. Также я бы рекомендовал использовать библиотеку 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

В случае успешного входа в систему в следующий раз вам не придется снова вводить имя пользователя и пароль.

Другие вопросы по тегам