Hilfe
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 

API Authentifizierung schlägt fehl

pandas
Autor
2 Beiträge

Hallo liebe API-Tüftler,

ich versuche mich gerade daran mittels Python und dem Modul 'requests' meine Umsätze abzurufen und anschließend 'Data science' zu betreiben (mein Nutzername verrät schon womit).

 

Kommunikation mit der API, abrufen des Access-Tokens, abrufen der TAN-challenge etc. funktioniert problemlos, allerdings will mich die API beim besten Willen nicht reinlassen. Ich bekomme, egal ob die TAN korrekt oder absichtlich falsch ist, den Fehlercode 415.

Es geht dabei um den Punkt 2.4 in der API-Dokumentation.

 

Die Antwort der API sieht wie folgt aus:

{"code":"request.object.invalid",
"messages":[{"severity":"ERROR",
"key":"UNPROCESSABLE_ONCE_AUTHENTICATION_INFO_HEADER",
"message":null,
"args":{},
"origin":[]}]}

Es liegt also an dem von mir konstruiertem once-authentication-info-header.

 

Der gesamte Header wie er in Pythons requests-Object zufinden ist: (zensiert natürlich)

{'User-Agent': 'python-requests/2.22.0',
'Accept-Encoding': 'gzip, deflate',
'Accept': 'application/json',
'Connection': 'keep-alive',
'Content-Type': 'application/json',
'x-http-request-info': "{'clientRequestId': {'sessionId': '11aa22bb33cc44dd55ee66ff11aa22bb', 'requestId': '12345678'}}",
'Authorization': 'Bearer 1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d',
'x-once-authentication-info': "{'id': '12345678'}",
'x-once-authentication': '123456',
'Content-Length': '98'}

und der body:

 

{"identifier": "11aa22bb33cc44dd55ee66ff11aa22bb",
"sessionTanActive": true,
"activated2FA": true}

 

Ich kann allerdings keine Diskrepanzen meines Headers und dem in der Doku definiertem finden (oder ich bin betriebsblind geworden).

 

Habe das ganze auch schonmal in Postman versucht und da funktioniert der Request dann ohne Probleme.

 

Wenn einer von euch mir da helfen kann oder sich vielleicht sogar mit dem requests-Modul in Pyhton auskennt, wäre mir schon sehr geholfen.

 

Grüße

pandas

 

Edit: Lesbarkeit des Codes verbessert

3 ANTWORTEN

SMT_Jan-Ove
ehemaliger Mitarbeiter
4.279 Beiträge

Hallo @pandas,

 

herzlich willkommen in unserer Community! 🙂

 

Deine Header 'x-http-request-info' und 'x-once-authentication-info' weisen einen kleinen Unterschied zu denen aus der Doku auf.

 

Bitte nimm die Anführungszeichen vor den geschweiften Klammern weg. Dann sollte das passen und deine beiden Header der Dokumentation auf Seite 11 entsprechen, also:

 

'x-http-request-info': '{"clientRequestId":{"sessionId":"11aa22bb33cc44dd55ee66ff11aa22bb","requestId":"12345678"}}',
'x-once-authentication-info': '{"id": "12345678"}',

 

Solltest du unsere Postman-Collection nutzen, kannst du in der oberen Taskleiste auf der rechten Seite auf "Code" klicken und anschließend die gewünschte Programmiersprache (in diesem Fall Python) auswählen. Im Anschluss generiert Postman den Request als Codeschnipsel in der gewünschten Programmiersprache.

 

Beste Grüße

Jan-Ove

pandas

Hallo @SMT_Jan-Ove ,

vielen Dank für die zügige Antwort.


Ganz so leicht ist die Lösung des Problems leider nicht.

Da das requests-Modul die Header in der Form {'key':'value'} verlangt, muss somit ein geschachteltes Dict in einen String gecastet werden:

 

requests.exceptions.InvalidHeader:
Value for header {x-http-request-info: {'clientRequestId': {'sessionId': '11aa22bb33cc44dd55ee66ff11aa22bb', 'requestId': '12345678'}}}
must be of type str or bytes, not <class 'dict'>

 

Ich hab nun mal, wie vorgeschlagen den Code aus Postman kopiert mit dem Format wie dort angegeben, funktioniert der Request.

 

Ich habe dann schlussendlich auch zur Lösung des Problems gefunden:
Es war in der Tat die Konstruktion der einzelnen Header.

Mein Fehler war ein (wie oben beschrieben) ein Dict in einen String zu casten.

Besser ist es wenn man bereits als 'Value' einen String verwendet und diesen mit der Stringformat-Methode konstruiert:

{'x-once-authentication-info': '{{\"id\": \"{tan_id}\"}}'.format(tan_id=tan_challange['id'])}

Dabei ist folgendes (sehr wichtiges) zu beachten:

Das Dictionary charakterisiert sich durch einschließende geschweifte Klammern. Dummerweise genau so die die Keywords auf die '.format()' reagiert!

 

Es ist hier also wichtig die Klammern für das Dictionary zu escapen. Also mit doppelten Klammern '{{' der format-Funktion klarmachen das dies kein Keyword enthält...

Uff... was eine hinterhältige Feinheit.

 

Danke für deine Hilfe und schöne Grüße

pandas

 

apitragehq

Edit: Werbung entfernt