Ausführen eines API-Aufrufs in Python mit einer API, für die ein Inhaber-Token erforderlich ist

92

Suchen Sie nach Hilfe bei der Integration eines JSON-API-Aufrufs in ein Python-Programm.

Ich möchte die folgende API in ein Python .py-Programm integrieren, damit sie aufgerufen und die Antwort gedruckt werden kann.

Die API-Anleitung besagt, dass ein Inhaber-Token generiert werden muss, um Aufrufe der API zu ermöglichen, was ich erfolgreich durchgeführt habe. Ich bin mir jedoch nicht sicher, wie dieses Token als Token-Token-Authentifizierung in die Python-API-Anforderung aufgenommen werden soll.

Ich kann die obige Anfrage mit cURL mit einem enthaltenen Token erfolgreich abschließen. Ich habe "urllib" - und "request" -Routen ausprobiert, aber ohne Erfolg.

Vollständige API-Details: IBM X-Force Exchange-API-Dokumentation - IP-Reputation

user4657
quelle

Antworten:

143

Es bedeutet nur, dass es dies als Schlüssel in Ihren Header-Daten erwartet

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
quelle
Das Obige löst den folgenden Syntaxfehler aus: 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 unten: 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() Irgendwelche Ideen?
user4657
Sie haben eine alte Version von Anfragen ... jsonist ein Diktat in Ihrer Version und keine Funktion requests.post(...).json ... nennen Sie es nicht
Joran Beasley
Vielen Dank, Joran Beasley. Die Anforderungsbibliothek wurde über pip aktualisiert, sodass ich die ursprüngliche Syntax beibehalten konnte. Wenn ich jetzt das oben genannte ausführe, wird die folgende .json-Antwort ausgegeben: {u'error': u'Not authorized. Access is only allowed via https://exchange.xforce.ibmcloud.com/#/'} Dies ist das gleiche, als würde ich die URL direkt in einem Browser drücken . Vermisse ich etwas mit Token oder wie der Endpunkt konfiguriert ist? 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
Leider kann ich dabei nicht wirklich helfen ... es ist entweder ein schlechter Endpunkt oder Ihre Anmeldeinformationen sind ungültig (verwenden Sie ihr Beispiel-Token, das nur für ihre URL konfiguriert ist?) oder Sie müssen Ihre App-URL in ihren Deleoper einfügen Panel für Ihren Code ... wahrscheinlich ist dies Ihr erstes Token ... Sie müssen das Token gegen ein Aktualisierungstoken austauschen, mit dem Sie ein dauerhafteres Token erhalten können (zumindest funktioniert oauth2 normalerweise so ..)
Joran Beasley
whoops sieht aus wie ich hatte den Header falsch versuchen Sie den aktualisierten Code
Joran Beasley
50

Wenn Sie ein requestsModul verwenden, können Sie alternativ eine Authentifizierungsklasse schreiben, wie unter " Neue Authentifizierungsformen " beschrieben:

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

und dann können Sie Anfragen wie diese senden

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

Dies ermöglicht es Ihnen, dasselbe authArgument wie bei der Basisauthentifizierung zu verwenden und kann Ihnen in bestimmten Situationen helfen.

Zhe
quelle
Dies kann auch bei Zeep nützlich sein. Es verwendet die Berechtigungen vom Typ
request.auth
20

Das Token muss in einem Autorisierungsheader in folgendem Format abgelegt werden:

Autorisierung: Inhaber [Token_Value]

Code unten:

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