【问题标题】:Getting an Ebay OAuth Token获取 Ebay OAuth 令牌
【发布时间】:2017-10-18 05:09:28
【问题描述】:

我这周大部分时间都在研究 ebaySDK。我已经设法将交易和购物 API 集成到我的项目中。对于交易 API,我使用的是 Auth n Auth 令牌,有效期最长为 18 个月。我需要用于 Sell API 的 OAuth 令牌仅在一天内有效,因此我需要在它过期之前定期获取它。 我遵循了网站上的文档,甚至尝试在 github 上查看 python 存储库,但我还没有能够继续前进。这是我的请求代码的快速 sn-p,我做错了什么?

import requests, json, base64, xmltodict

AppSettings = {
    'app_id' : 'my_app_id',
    'app_secret' : 'my_app_secret',
    'dev_id': 'my_dev_id',
    'ruName': 'the_ruName_for_my_app'
}
authHeaderData =  AppSettings['app_id']+':'+AppSettings['app_secret']
encodedAuthHeader = base64.b64encode(authHeaderData)

session = requests.Session()

print encodedAuthHeader 
url = 'https://api.ebay.com/identity/v1/oauth2/token'

session.headers.update({
    'Content-Type':'application/x-www-form-urlencoded',
    'Authorization':'Basic '+encodedAuthHeader
    })

data = {
    'grant_type':'client_credentials',
    'redirect_uri': AppSettings['ruName'],
    'scope':'https://api.ebay.com/oauth/api_scope'
}

response = session.post(url, data=data).json()
print response

我得到的回应是:

{u'error_description': u'client authentication failed', u'error': u'invalid_client'}

我检查了所有的钥匙。我什至尝试通过 ebay 提供的生产登录来获取令牌,但无济于事。我从 ebay 提供的 url 得到的响应是 html 和 js 代码(没有 JSON 或任何数据)。

有人遇到过类似的问题吗?我该如何解决这个问题?我是否提出了错误的请求?非常感谢任何见解

【问题讨论】:

  • 好的,经过一些更适当的研究和深入研究文档后,我在 eBay 论坛上偶然发现了这个答案,它基本上打破了这个过程。 forums.developer.ebay.com/questions/18489/… 所以现在对于 oauth 用户令牌,我要去 eBay 提供的登录链接并为用户填写登录信息。让我们看看接下来会发生什么。
  • 你能通过吗?您需要每 2 小时进行一次登录过程吗?
  • @mentorgashi 不,我不需要每隔几个小时登录一次,因为响应会在令牌旁边给我一个刷新令牌。我可以在令牌过期时使用刷新令牌生成新令牌
  • 你解决了吗?
  • @Jobs 你能用你的最终解决方案回答你的问题吗?

标签: python django oauth ebay-api


【解决方案1】:

因为遍历 eBays 文档来找到这个答案真是一场噩梦,所以我想我会发布解决这个问题的函数。

import requests, urllib, base64

def getAuthToken():
     AppSettings = {
          'client_id':'<client_id>',
          'client_secret':'<client_secret>',
          'ruName':'<ruName>'}

     authHeaderData = AppSettings['client_id'] + ':' + AppSettings['client_secret']
     encodedAuthHeader = base64.b64encode(str.encode(authHeaderData))

     headers = {
          "Content-Type" : "application/x-www-form-urlencoded", 
          "Authorization" : "Basic " + str(encodedAuthHeader)
          }

     body= {
          "grant_type" : "client_credentials",
          "redirect_uri" : AppSettings['ruName'],
          "scope" : "https://api.ebay.com/oauth/api_scope"
      }

     data = urllib.parse.urlencode(body)

     tokenURL = "https://api.ebay.com/identity/v1/oauth2/token"

     response = requests.post(tokenURL, headers=headers, data=data) 
     return response.json()


response = getAuthToken()
print(response)
response['access_token'] #access keys as required
response['error_description'] #if errors

【讨论】:

  • 仅供参考,requests 将在您传入 python dict 时将 Content-Type 标头设置为 application/x-www-form-urlencoded。所以你可以把它缩短为requests.post(..., data=body)
  • 我怎样才能为用户获取令牌,所以我可以和https://api.ebay.com/sell/fulfillment/v1/order?limit=10一起使用?
  • 您需要在授权标头中使用“Bearer ”
  • 如果您对此有任何错误,请检查您的encodedAuthHeader,它可能有b'和一个尾随'
  • @RyanPPG 我正在使用具有正确生产客户端 ID 和机密的确切代码,但我不断收到“ {'error': 'invalid_request', 'error_description': 'request is missing an required parameter or malformed .'}
【解决方案2】:

@sunny babau 我遇到了和你一样的问题。它确实是由 b' 和尾随的 ' 引起的。在上面的代码中添加以下行(删除这些字符)后,它对我有用:

encodedAuthHeader = str(encodedAuthHeader)[2:len(str(encodedAuthHeader))-1]

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 2019-06-02
    • 2017-11-20
    • 1970-01-01
    • 2017-06-23
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多