2017-05-13 1 views
0

OAuth을 사용하기위한 Python 프로그램을 작성했습니다. 액세스 토큰 (예 : Twitter)을 사용하여 서비스 리소스에 액세스하는 동안 한 가지 문제를 관찰하고 있습니다.트위터 인증 헤더 사용시 인증 데이터가 잘못되었습니다.

access_token을 성공적으로 검색 할 수 있지만 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) 
     ] 

: 문제

urlLink = "https://api.twitter.com/1.1/account/settings.json" 
url = "?".join((urlLink, urllib.urlencode(parameters_access_resource))) 
reqobj = urllib2.Request(url,data=[]) 
resp = urllib2.urlopen(reqobj) 
print resp.read() 

: 트위터 문서 당으로

access_tokenAuthorization 헤더로 전달되어야한다, 그래서 나는

다음과 같이 코드를 수정
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."}]} 

누군가이 문제를 해결하는 방법을 안내해 줄 수 있습니까?

P.S : 이미이 작업에 사용할 수있는 많은 모듈이 있다는 것을 알고 있지만 학습 목적으로이 코드를 작성하고 있습니다.

답변

0

해결책을 찾았습니다. 헤더를 만들 때 문제가 발생했습니다. 헤더의 값이 percent-encoding이 아니 었습니다. 아래 코드가 문제를 해결했습니다.

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='')