使用twitter身份验证头的身份验证数据错误

2024-09-28 03:12:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个Python程序来使用OAuth。我在使用accesstoken访问服务资源时发现了一个问题(以Twitter为例)。在

我能够成功地检索access_token,但是如果我试图在twitter中使用access_token作为Authorization头,那就行不通了。不过,如果我得到的是普通的url,那么我会得到想要的结果。在

parameters_access_resource = [
        ('oauth_consumer_key', self.consumerKey),
        ('oauth_signature_method', 'HMAC-SHA1'),
        ('oauth_timestamp', self._timestamp),
        ('oauth_nonce', self._nonce),
        ('oauth_version', '1.0'),
        ('oauth_token', self._accessToken),
        ('oauth_signature', self._signature)
        ]

以下方法有效:

^{pr2}$

问题:

根据Twitter文档,access_token应该作为Authorization头传递,所以我修改了如下代码

headers = {
    "Accept": "*/*",
    "Connection": "close",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Content-Type" : "application/x-www-form-urlencoded",
    "Host" : "api.twitter.com",
    "Authorization" : self._getAuthorizationHeader(parameters_access_resource)
    }


def _getAuthorizationHeader(self,params):
    params = dict(params)
    sortedParams = {}
    sortedParams = collections.OrderedDict(sorted(params.items()))
    authHeader = (
    '%s="%s"' % (k, v) for k, v in sortedParams.iteritems())
    retval = "OAuth " + ', '.join(authHeader)
    return retval

url = "https://api.twitter.com/1.1/account/settings.json"
reqobj = urllib2.Request(url,data=[],headers=headers)
resp = urllib2.urlopen(reqobj)
print resp.read()

报告以下错误后,我尝试了不同的组合,包括使用requests模块,但我无法解决问题。在

{"errors":[{"code":215,"message":"Bad Authentication data."}]}

有人能告诉我如何解决这个问题吗。在

附言:我知道已经有很多模块可以完成这个任务,但是我写这段代码是为了学习。在


Tags: selftokenurlaccessapplicationtwitterparamsoauth
1条回答
网友
1楼 · 发布于 2024-09-28 03:12:01

找到了一个解决方案,在构建header时出现了一个问题,我不是percent-encodingheader的值。下面的代码解决了这个问题

def _getAuthorizationHeader(self,params):
    params = dict(params)
    sortedParams = {}
    sortedParams = collections.OrderedDict(sorted(params.items()))
    authHeader = (
    '%s="%s"' % (k, self._url_encode(v)) for k, v in sortedParams.iteritems())
    retval = "OAuth " + ', '.join(authHeader)
    return retval

def _url_encode(self,s):
    return urllib.quote(str(s),safe='')

相关问题 更多 >

    热门问题