【问题标题】:How do I retrieve a username with Python keyring?如何使用 Python 密钥环检索用户名?
【发布时间】:2013-02-20 12:33:37
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python windows python-keyring


    【解决方案1】:

    虽然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 提供此解决方案。

    【讨论】:

    • 最后一行的username不应该是_username吗?
    • 密钥(不是密码)是否安全地存储在钥匙串中,或者该“配对”解决方案是否会暴露用户名?
    【解决方案2】:

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

    密钥环只存储密码,由应用程序名称和用户名作为密钥。

    【讨论】:

      【解决方案3】:

      在 Windows 上,我能够使用

      获得用户名和密码(即“凭据”)

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

      请注意,这在 macOS 上不起作用,keyring 后端没有搜索条目的功能 - 即您需要知道用户名。不过,我想本机代码可以让您执行此操作,请参阅 official docs

      【讨论】:

      • 值得一提的是,您可以访问用户名、密码,如下所示:c.usernamec.password
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-09-24
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        • 2016-11-13
        • 2017-12-31
        相关资源
        最近更新 更多