Passer un appel d'API en Python avec une API qui nécessite un jeton de support

91

Vous recherchez de l'aide pour intégrer un appel d'API JSON dans un programme Python.

Je cherche à intégrer l'API suivante dans un programme Python .py pour lui permettre d'être appelé et la réponse à imprimer.

Les directives de l'API indiquent qu'un jeton de support doit être généré pour autoriser les appels à l'API, ce que j'ai fait avec succès. Cependant, je ne suis pas sûr de la syntaxe pour inclure ce jeton en tant qu'authentification de jeton de support dans la demande d'API Python.

Je peux compléter avec succès la demande ci-dessus en utilisant cURL avec un jeton inclus. J'ai essayé les routes "urllib" et "demandes" mais en vain.

Détails complets de l'API: Documentation de l'API IBM X-Force Exchange - Réputation IP

user4657
la source

Réponses:

142

Cela signifie simplement qu'il s'attend à cela en tant que clé dans vos données d'en-tête

import requests
endpoint = ".../api/ip"
data = {"ip": "1.1.2.3"}
headers = {"Authorization": "Bearer MYREALLYLONGTOKENIGOT"}

print(requests.post(endpoint, data=data, headers=headers).json())
Joran Beasley
la source
Ce qui précède renvoie l'erreur de syntaxe suivante: Traceback (most recent call last): File "bearerreturn.py", line 6, in <module> print requests.post(endpoint,data=data,headers=headers).json() TypeError: 'dict' object is not callable Code ci-dessous: des import requests endpoint = "https://xforce-api.mybluemix.net:443/api/ip" data = {"ip":"1.1.2.3"} headers = {"Bearer token":"TOKEN WAS INSERTED HERE"} print requests.post(endpoint,data=data,headers=headers).json() idées?
user4657
vous avez une ancienne version des requêtes ... jsonest un dict dans votre version et non une fonction requests.post(...).json ... ne l'appelez pas
Joran Beasley
Merci Joran Beasley. Mise à jour de la bibliothèque Requests via pip et cela m'a permis de conserver la syntaxe originale. Cependant, maintenant, lorsque j'exécute ce qui précède, il génère cette réponse .json: {u'error': u'Not authorized. Access is only allowed via https://exchange.xforce.ibmcloud.com/#/'} C'est la même chose que si je frappe l'URL directement dans un navigateur. Est-ce que je manque quelque chose avec le jeton ou la façon dont le point de terminaison est configuré? Code:import requests endpoint = "https://xforce-api.mybluemix.net:443/ipr/" data = {"ip":"1.1.2.3"} headers = {"Bearer token":"TOKEN_HERE"} print requests.post(endpoint,data=data,headers=headers).json()
user4657
malheureusement, je ne peux pas vraiment aider avec ça ... c'est soit un mauvais point de terminaison, soit vos informations d'identification ne sont pas valides (utilisez-vous leur exemple de jeton, qui n'est configuré que pour leur URL?) ou peut-être que vous devez mettre l'URL de votre application dans leur deleoper panneau pour votre code ... il y a de fortes chances que ce soit votre premier jeton ... vous devez échanger un jeton contre un jeton d'actualisation que vous pouvez ensuite utiliser pour obtenir un jeton plus permanent (du moins c'est comme ça que fonctionne habituellement oauth2 ..)
Joran Beasley
regards whoops comme je l' ai eu le tort d' en- tête essayez le code mis à jour
Joran Beasley
50

Si vous utilisez le requestsmodule, une autre option consiste à écrire une classe d'authentification, comme indiqué dans " Nouveaux formulaires d'authentification ":

import requests

class BearerAuth(requests.auth.AuthBase):
    def __init__(self, token):
        self.token = token
    def __call__(self, r):
        r.headers["authorization"] = "Bearer " + self.token
        return r

puis pouvez-vous envoyer des demandes comme celle-ci

response = requests.get('https://www.example.com/', auth=BearerAuth('3pVzwec1Gs1m'))

qui vous permet d'utiliser le même authargument tout comme l'authentification de base, et peut vous aider dans certaines situations.

Zhe
la source
Cela peut également être utile avec zeep. Il utilise des autorisations de type
requests.auth
20

Le jeton doit être placé dans un en-tête d'autorisation selon le format suivant:

Autorisation: porteur [Token_Value]

Code ci-dessous:

import urllib2
import json

def get_auth_token()
    '''
    get an auth token
    '''
     req=urllib2.Request("https://xforce-api.mybluemix.net/auth/anonymousToken")
     response=urllib2.urlopen(req)
     html=response.read()
     json_obj=json.loads(html)
     token_string=json_obj["token"].encode("ascii","ignore")
     return token_string

def get_response_json_object(url, auth_token)
    '''
      returns json object with info
    '''
    auth_token=get_auth_token()
    req=urllib2.Request(url, None, {"Authorization": "Bearer %s" %auth_token})
    response=urllib2.urlopen(req)
    html=response.read()
    json_obj=json.loads(html)
    return json_obj
DSG
la source
Pour Python3:req = urllib.request.Request(urlstr, None, {"Authorization": "Bearer %s" % enc_authstr}) response = urllib.request.urlopen(req)
SidJ