【问题标题】:Authenticating API calls using requests and requests-oauthlib in Python 3.3在 Python 3.3 中使用 requests 和 requests-oauthlib 验证 API 调用
【发布时间】:2014-04-26 01:31:23
【问题描述】:

我正在尝试使用 requests 和 requests-oauthlib 库在 Python 3 中编写自己的 Cryptsy API 包装器。我对 API 调用和 Python 都很陌生。就目前而言,我收到此错误:

{'error': 'Unable to Authorize Request - Check Your Post Data', 'success': '0'}

这不足为奇,因为我很难找到有关使用这些库调用/签署经过身份验证的 API 请求的文档。我不太确定从哪里开始。

这是我的代码的 sn-p:

import time
import requests
from requests-oauthlib import OAuth1Session

class Cryptsy:

    def __init__(self, APIKey, Secret):
        self.APIKey = APIKey
        self.Secret = Secret
        self.privateBaseURL = 'https://api.cryptsy.com/api'

    def private_api_query(self, method, payload={}):
        url = self.privateBaseURL
        session = OAuth1Session(self.APIKey, client_secret=self.Secret)
        payload['method'] = method
        payload['nonce'] = int(time.time())
        response = session.post(url, data=payload)
        js = response.json()
        return js

    def getMarkets(self):
        return self.private_api_query('getmarkets')

如您所见,我隐约知道 nonce,但我不确定在使用这些库时是否有必要。我知道请求需要签名,但不确定如何让这些库以我需要的方式执行此操作。

当然,我总是可以尝试使用 urllib,但自从切换到 Python 3 后我就遇到了麻烦,而且我喜欢 requests 库的(假定的)简单性。

关于 Cryptsy 的 API 的更多信息可以在这里找到:https://www.cryptsy.com/pages/api

任何帮助将不胜感激。

【问题讨论】:

  • 查看 Cryptsy API 文档似乎表明 Cryptsy 根本不使用 OAuth。我在他们的文档中看不到它的引用。

标签: python api oauth python-requests


【解决方案1】:

Cryptsy 不使用 OAuth(至少他们的文档没有声称他们这样做)。相反,他们推出自己的身份验证。暂时不考虑这种方法的安全性,让我们来看看您需要什么。

他们的文档不是很好,但根据我对 ityYou 的阅读需要:

  • 两个额外的标头:Key(包含您的公共 API 密钥)和 Sign(包含正文的 HMAC-SHA512 签名)
  • 内容类型为application/x-www-form-urlencoded 的请求正文,其中包含方法名称、方法参数和随机数。

在请求中进行这项工作比平时要简单一些,但最简单的方法可能是编写自己的自定义Authentication handler。这是一个例子:

from requests.auth import AuthBase
import hmac
import hashlib
import time

class CryptsyAuth(AuthBase):
    """Authenticates a given HTTP request using the Cryptsy Auth scheme"""
    def __init__(self, api_key, api_secret):
        self.key = api_key
        self.secret = api_secret

    def __call__(self, r):
        r.body += '&nonce=%d' % int(time.time())
        h = hmac.new(self.secret, r.body, hashlib.sha512).hexdigest()

        r.headers['Key'] = self.key
        r.headers['Sign'] = h
        return r

请注意,如果您不提供请求正文,此身份验证处理程序将会失败,但这没关系,因为 Cryptsy 要求您这样做。使用方法如下:

class Cryptsy:

    def __init__(self, APIKey, Secret):
        self.APIKey = APIKey
        self.Secret = Secret
        self.privateBaseURL = 'https://api.cryptsy.com/api'
        self.session = requests.Session()

    def private_api_query(self, method, payload={}):
        url = self.privateBaseURL
        payload['method'] = method
        response = self.session.post(url, data=payload, auth=CryptsyAuth(self.APIKey, self.Secret))
        js = response.json()
        return js

    def getMarkets(self):
        return self.private_api_query('getmarkets')

【讨论】:

  • 这很好用!太感谢了。我必须做的唯一更改是将 hmac 参数编码为字节。 h = hmac.new(bytes(self.secret, 'utf-8'), bytes(r.body, 'utf-8'), hashlib.sha512).hexdigest()
猜你喜欢
  • 2020-06-05
  • 1970-01-01
  • 2014-09-18
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多