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

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

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.


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

Python3:req = urllib.request.Request(urlstr, None, {"Authorization": "Bearer %s" % enc_authstr}) response = urllib.request.urlopen(req)
SidJ
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.