2017-05-13 2 views
0

ich ein Python-Programm für die Verwendung von OAuth geschrieben haben. Ich beobachte ein Problem beim Zugriff auf Service-Ressourcen mit Access Token (Twitter als Beispiel).Bad Authentifizierungsdaten zur Verwendung von Twitter-Authentifizierung Header

Ich bin in der Lage, erfolgreich die access_token abzurufen, aber wenn ich versuche, access_token als Authorization Header in Twitter zu verwenden, funktioniert es nicht. Wenn ich dies jedoch als normale URL-Parameter übergebe, bekomme ich die gewünschten Ergebnisse.

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) 
     ] 

Below Methode funktioniert:

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() 

Problem:

Per Twitter Dokumentation, die access_token sollte als Authorization Header übergeben werden, so modifiziert ich den Code wie unten

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() 

Nach Fehlern gemeldet, ich habe verschiedene Kombinationen ausprobiert, einschließlich der Verwendung von requests Modul, aber ich bin nicht in der Lage, das Problem zu verstehen.

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

Kann mir bitte jemand sagen, wie man dieses Problem löst.

P.S: Ich weiß, dass es bereits viele Module für diese Aufgabe gibt, aber ich schreibe diesen Code für meinen Lernzweck.

Antwort

0

Eine Lösung gefunden, gab es ein Problem beim Erstellen von Header, ich war nicht percent-encoding die Werte für Authentication Header. Im Folgenden Code, um das Problem

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='') 
Fest
Verwandte Themen