【问题标题】:oauth1.0 with username and password in pythonpython中带有用户名和密码的oauth1.0
【发布时间】:2019-08-21 01:13:38
【问题描述】:

我正在尝试将 qwikcilver API 集成到我的项目中。他们使用 oauth1.0 进行身份验证。我正在为 oauth1.0 使用 requests-oauthlib python lib。
这是我的身份验证代码。

# Using OAuth1Session
oauth = OAuth1Session(client_key, client_secret=client_secret)
fetch_response = oauth.fetch_request_token(request_token_url)
{
    "oauth_token": "Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hhlSLik",
    "oauth_token_secret": "Kd75W4OQfb2oJTV0vzGzeXftVAwgMnEK9MumzYcM"
}
resource_owner_key = fetch_response.get('oauth_token')
resource_owner_secret = fetch_response.get('oauth_token_secret')

我的查询如下,
qwikcilver 有用户名和密码。我尝试了很多在代码中发送用户名和密码但没有工作。

requests-oauthlib请求函数中如何传递用户名和密码?

【问题讨论】:

    标签: python oauth python-requests oauth-1.0a requests-oauthlib


    【解决方案1】:

    我正在添加一个带有帖子正文的示例。这是一个使用“Plain Old XML”(POX)模式的请求/发布的简单示例:

    from requests_oauthlib import OAuth1Session
       
    CONSUMER_KEY = "xxxxxxx"
    CONSUMER_SECRET = "xxxxxxx"
    
    ourSession = OAuth1Session(CONSUMER_KEY, client_secret=CONSUMER_SECRET, force_include_body=True)
    
    body= '<?xml version="1.0" encoding="UTF-8"?>' \
       '<POXEnvelopeRequest xmlns="http://whateve">' \
       '<POXHeader>' \
       ' <RequestHeaderInfo>' \
          .   .   .   .
       ' </RequestHeaderInfo>' \
       '</POXHeader>'   \
       '</POXEnvelopeRequest>'
    
    clen = str(len(body))
    
    headers = {
     'Accept': '*/*',
     'Accept-Encoding': 'gzip, deflate, br',
     'Host': 'X.Y.com',
     'Content-Type': 'application/xml',
     'Connection': 'keep-alive',
     'Content-Length': clen
    }
    
    r = ourSession.post(url, headers=headers, data=body, verify=False)
    
    # DEBUG: Comment out in and out as needed... 
    print("===================== B E G I N    R E S P O N S E =======================\n")
    print(r)
    print(r.text)
    print("===================== E N D    of  R E S P O N S E =======================\n")
    

    【讨论】:

      【解决方案2】:

      与 qwikcilver(无论是什么)检查他们是否有生成令牌和授权的规定。如果是这样,您可以将令牌用作标头的一部分并调用 API。如果那不存在,请检查他们是否允许 2 条腿呼叫。但是,此类服务通常不允许普通用户进行 2 条腿呼叫。

      对于三足通话,您可能需要浏览器来完成授权。

      在您的代码中,您调用了请求令牌并且您正尝试使用它来获得对服务的访问权限。哪个行不通。请求令牌只是一个必须授权的临时令牌。请求令牌不能用于此类 API 调用。不起作用。授权后,您将需要调用访问令牌 API 来获取您的实际令牌 - 可用于访问您被授权的服务。

      简而言之,就是这个过程

      1) 请求令牌 >> 2) 授权>> 3) 访问令牌

      这就是流程。 Python 示例

      oauth1Session = OAuth1Session(clientKey, clientSecret)
      
      def requestToken(self):
          requestTokenResponse = oauth1Session.fetch_request_token(oauth1RequestTokenUrl, realm)
      
          token = requestTokenResponse.get('oauth_token')
          secret = requestTokenResponse.get('oauth_token_secret')
      
          return (token, secret)
      
      def authorize(self, token):
          authUrl = oauth1Session.authorization_url(oauth1AuthorizeUrl, token)
          print (authUrl)
      
          #########
          # THIS IS WHERE YOU NEED THE BROWSER. 
          # You visit authUrl and login with your Username and Password. 
          # This will complete Authorization
      
          return authUrl
      
      def accessToken(self):
          accessTokenResponse = oauth1Session.fetch_access_token(oauth1AccessTokenUrl)
      
          print (accessTokenResponse) 
      
          #########
          #accessTokenResponse contains your actual token
          #
      

      对于浏览器部分 - 您可以尝试 Python 的 Chromium 绑定(之前尝试过的人很少 - 例如这个https://github.com/cztomczak/cefpython)。还有其他选项,例如使用默认安装的浏览器等。选择适合你的任何东西。

      一旦你准备好了——你可以通过编程方式访问 URL (authUrl) 并且一旦获得授权(登录,然后是“允许”)——你可能会被重定向到一个回调(在 OAuth1 的情况下你指定),并带有“代码”查询字符串。这是授权码。

      获得授权码后,您可以关闭浏览器窗口并调用 Get Access Token 调用 (fetch_access_token)。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 2011-05-27
        • 2011-02-05
        • 2019-07-30
        • 2017-07-23
        • 2013-08-26
        • 1970-01-01
        相关资源
        最近更新 更多