2017-05-13 4 views
0

J'ai écrit un programme Python pour utiliser OAuth. J'observe un problème lors de l'accès aux ressources de service en utilisant le jeton d'accès (Twitter comme exemple).Données d'authentification incorrectes sur l'utilisation des en-têtes d'authentification Twitter

Je suis en mesure de récupérer avec succès le access_token, mais si j'essaie d'utiliser access_token en tant que Authorization en-tête dans twitter, cela ne fonctionne pas. Cependant, si je le transmets comme paramètres url normaux, alors j'obtiens les résultats désirés.

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

Ci-dessous travaux Méthode:

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

Problème:

Selon la documentation Twitter, le access_token doit être passé comme Authorization tête, donc je modifie le code ci-dessous

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

L'erreur suivante est rapportée, j'ai essayé différentes combinaisons, y compris en utilisant le module requests mais je n'arrive pas à comprendre le problème.

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

Quelqu'un peut-il me guider s'il vous plaît sur la façon de résoudre ce problème. P.: Je sais qu'il y a beaucoup de modules déjà disponibles pour cette tâche, mais j'écris ce code pour mon but d'apprentissage.

Répondre

0

0% trouvé une solution, il y avait un problème dans l'en-tête de construction, je n'étais pas percent-encoding les valeurs pour Authentication en-tête. Le code ci-dessous a corrigé le problème

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