Wykonywanie wywołania API w Pythonie z API, które wymaga tokenu okaziciela

91

Szukasz pomocy w integracji wywołania JSON API z programem w języku Python.

Chcę zintegrować następujący interfejs API w programie Python .py, aby umożliwić jego wywołanie i wydrukowanie odpowiedzi.

Wskazówki dotyczące interfejsu API stanowią, że należy wygenerować token okaziciela, aby umożliwić wywołania interfejsu API, co zostało pomyślnie wykonane. Jednak nie jestem pewien składni dołączania tego tokenu jako uwierzytelniania tokenu okaziciela w żądaniu interfejsu API języka Python.

Mogę pomyślnie zrealizować powyższe żądanie za pomocą cURL z dołączonym tokenem. Próbowałem tras "urllib" i "żądań", ale bezskutecznie.

Pełne szczegóły interfejsu API: Dokumentacja interfejsu API IBM X-Force Exchange - reputacja IP

user4657
źródło

Odpowiedzi:

142

Oznacza to po prostu, że oczekuje tego jako klucza w danych nagłówka

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
źródło
Powyższe zgłasza następujący błąd składni: 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 Kod poniżej: 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() jakieś pomysły?
user4657
masz starą wersję próśb ... jsonto dykt w twojej wersji, a nie funkcja requests.post(...).json ... nie nazywaj tego
Joran Beasley
Dzięki, Joran Beasley. Zaktualizowana biblioteka żądań za pośrednictwem pip, co pozwoliło mi zachować oryginalną składnię. Jednak teraz, gdy uruchomię powyższe, wyświetla następującą odpowiedź .json: {u'error': u'Not authorized. Access is only allowed via https://exchange.xforce.ibmcloud.com/#/'} To jest to samo, co gdybym trafił na adres URL bezpośrednio w przeglądarce. Czy brakuje mi czegoś z tokenem lub sposobem skonfigurowania punktu końcowego? Kod: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
niestety naprawdę nie mogę w tym pomóc ... to albo zły punkt końcowy, albo twoje dane uwierzytelniające są nieprawidłowe (czy używasz ich przykładowego tokena, który jest skonfigurowany tylko dla ich adresu URL?) lub może musisz umieścić adres URL swojej aplikacji w ich deleoperze panel dla twojego kodu ... prawdopodobnie to twój pierwszy token ... musisz wymienić token na token odświeżania, którego możesz użyć, aby uzyskać trwalszy token (przynajmniej tak zwykle działa oauth2 ..)
Joran Beasley
Ups, wygląda na to, że miałem zły nagłówek, spróbuj zaktualizowanego kodu
Joran Beasley
50

Jeśli korzystasz z requestsmodułu, alternatywną opcją jest napisanie klasy uwierzytelniania, zgodnie z opisem w „ Nowe formularze uwierzytelniania ”:

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

a potem możesz wysyłać takie żądania

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

co pozwala ci użyć tego samego authargumentu, tak jak basic auth i może ci pomóc w pewnych sytuacjach.

Zhe
źródło
Może to być również przydatne w przypadku zeep. Używa autoryzacji typu
request.auth
20

Token należy umieścić w nagłówku Authorization zgodnie z następującym formatem:

Autoryzacja: okaziciel [Token_Value]

Kod poniżej:

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