Hacer una llamada a la API en Python con una API que requiere un token de portador

91

Buscando ayuda para integrar una llamada a la API JSON en un programa Python.

Estoy buscando integrar la siguiente API en un programa Python .py para permitir que se llame y se imprima la respuesta.

La guía de la API establece que se debe generar un token de portador para permitir llamadas a la API, lo cual he hecho con éxito. Sin embargo, no estoy seguro de la sintaxis para incluir este token como autenticación de token de portador en la solicitud de la API de Python.

Puedo completar con éxito la solicitud anterior usando cURL con un token incluido. He intentado rutas "urllib" y "solicitudes" pero sin resultado.

Detalles completos de la API: Documentación de la API de IBM X-Force Exchange - Reputación de IP

user4657
fuente

Respuestas:

142

Solo significa que espera que, como clave en los datos de su encabezado

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
fuente
Lo anterior arroja el siguiente error de sintaxis: 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 Código siguiente: ¿ 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() Alguna idea?
user4657
tiene una versión antigua de las solicitudes ... jsones un dictado en su versión y no una función requests.post(...).json ... no la llame
Joran Beasley
Gracias Joran Beasley. Se actualizó la biblioteca de solicitudes a través de pip y esto me permitió mantener la sintaxis original. Sin embargo, ahora, cuando ejecuto lo anterior, genera esta respuesta .json: {u'error': u'Not authorized. Access is only allowed via https://exchange.xforce.ibmcloud.com/#/'} Esto es lo mismo que si presiono la URL directamente en un navegador. ¿Me falta algo con el token o la forma en que se configura el punto final? Código: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
desafortunadamente, realmente no puedo ayudar con eso ... o es un punto final incorrecto o sus credenciales no son válidas (¿está usando su token de ejemplo, que solo está configurado para su URL?) O tal vez necesite poner la URL de su aplicación en su eliminación panel para su código ... lo más probable es que ese sea su primer token ... necesita cambiar el token por un token de actualización que luego puede usar para obtener un token más permanente (al menos así es como suele funcionar oauth2 ..)
Joran Beasley
Vaya, parece que tenía el encabezado incorrecto, pruebe el código actualizado
Joran Beasley
50

Si está utilizando el requestsmódulo, una opción alternativa es escribir una clase de autenticación, como se explica en " Nuevas formas de autenticación ":

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

y luego puedes enviar solicitudes como esta

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

que le permite usar el mismo authargumento como autenticación básica y puede ayudarlo en ciertas situaciones.

Zhe
fuente
Esto también podría ser útil con zeep. Utiliza tipo requests.auth de autorizaciones (para cabeceras HTTP de autenticación, no encabezados SOAP)
smido
20

El token debe colocarse en un encabezado de autorización de acuerdo con el siguiente formato:

Autorización: Portador [Token_Value]

Código a continuación:

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
fuente
Para Python3:req = urllib.request.Request(urlstr, None, {"Authorization": "Bearer %s" % enc_authstr}) response = urllib.request.urlopen(req)
SidJ