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

REST API Schritt 2.2

Stephan3799
Autor
2 Beiträge

Laut der Dokumentation muss ich bei der Anfrage die SessionID und die RequestID mitschicken. Wo bekomme ich die her? bei der Authentifizierung waren die nicht in der JSON mit drin. Bin neu in dem Thema, deshalb wahrscheinlich eine dumme Frage, aber schonmal vielen Dank in Voraus!

8 ANTWORTEN

SMT_Jan-Ove
ehemaliger Mitarbeiter
4.279 Beiträge

Hallo @Stephan3799,

 

welches Programm/Tool nutzt du?

 

Wenn du Postman nutzt, kannst du einfach die Schnittstellen nacheinander abfragen. Also zunächst die Schnittstelle 2.1 OAuth2 Resource Owner Password Credentials Flow und im Anschluss die Schnittstelle 2.2 Session-Status, ohne dass es zu einer Fehlermeldung kommen sollte.

 

Die SessionId und auch die RequestId werden im Rahmen des Abrufs des Kapitels 2.1 OAuth2 Resource Owner Password Credentials Flow generiert werden. Eventuell hilft dir für deine Programmierung, wenn du in Postman auf den Button „Code“  (zu finden rechts unterhalb des Send Buttons) klickst und du dir den Code für deine gewählte Programmiersprache generieren lässt.

 

Beste Grüße

Jan-Ove

kevkev
Autor ★
7 Beiträge

Hallo Jan-Ove und Stephan3799,

 

Ich habe wahrscheinlich genau das gleiche Problem. Den Schritt 2.1 OAuth2 Resource Owner Password Credentials Flow in der Dokumentation (comdirect_REST_API_Dokumentation.pdf) habe ich mithilfe der requests Bibliotheek von Python prototypisch folgendermaßen umgesetzt: 

 

# Params
BASE_URL = 'https://api.comdirect.de'
CLIENT_ID = "meine client id"
CLIENT_SECRET = "mein client secret"
USERNAME = "meine Zugangsnummer"
PIN = "meine Pin"

# Get OAuth2 token
oauth_url = BASE_URL + '/oauth/token'
oauth_header = {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded'
}
oauth_body = {
'client_id': CLIENT_ID,
'client_secret': CLIENT_SECRET,
'username': USERNAME,
'password': PIN,
'grant_type': 'password'
}
oauth_response = requests.post(oauth_url, headers=oauth_header, data=oauth_body)
oauth_response = json.loads(oauth_response.text)
print(oauth_response)

Das Ergebnis davon sieht in etwa folgendermaßen aus:

{
'access_token': 'some_access_token',
'token_type': 'bearer',
'refresh_token': 'some_refresh_token',
'expires_in': 599,
'scope': 'TWO_FACTOR',
'kdnr': 'some_kdnr',
'bpid': 1111111111,
'kontaktId': 2222222222
}

 

Hieraus soll man sich den access_token extrahieren und in den Header der nächsten Abfragen verwenden. Soweit so gut.

 

Im nächsten Schritt 2.2 scheint es allerdings so als müsse man in dem folgenden Header nicht nur den access_token der letzten Abfrage verarbeiten, sondern auch eine sessionId, eine requestId, und vielleicht noch eine clientRequestId. Auf Seite 12 der Dokumentation steht nämlich folgendes:

 

Beispiel Header:

Accept:application/json
Authorization:Bearer 1234567890__Access-Token__1234567890
x-http-request-info:
{"clientRequestId":{"sessionId":"123_beliebige_ID_fuer_Session_12","
requestId":"123456789"}}
Content-Type:"application/json"

 

Da ich weder eine sessionIdrequestId, noch eine clientRequestId in dem Response Objekt des 1. Schrittes gefunden habe (auch nicht in dessen header), habe ich erst einmal naiver Weise folgendes probiert:

 

oauth_access_token = oauth_response['access_token']

# Get session status
session_url = BASE_URL + '/session/clients/{}/v1/sessions'.format(CLIENT_ID)
session_headers = {
'Accept': 'application/json',
'Authorization': "Bearer {}".format(oauth_access_token),
'x-http-request-info': '{"clientRequestId": {"sessionId": "123_beliebige_ID_fuer_Session_12", "requestId": "123456789"}}',
'Content-Type': "application/json"
}
session_response = requests.get(session_url, headers=session_headers)
print(session_response)

  Und dann kam, wie erwartet nichts gutes bei raus, nämlich:

 

<Response [404]>

 

Also meine Frage ist ersteinmal ob der Gedankengang stimmt, und falls ja, woher man die sessionId, die requestId, und die clientRequestId bekommt. 

 

VG
KS

SMT_Jan-Ove
ehemaliger Mitarbeiter
4.279 Beiträge

Hallo @kevkev,

 

das sieht schon sehr gut aus!

 

Die sessionId und die requestId kannst du selbst erzeugen und sie müssen bei jedem Request mitgesendet werden. Die sessionId ist eine 32-stellige Zahl in Hexadezimalnotation und sollte über die gesamte Sitzung deines Clients gleich lauten, die requestId ist 9-stellig und könnte z. B. aus einem Timestamp im Format HHmmssSSS bestehen.

 

Ein Beispiel dafür findest du in Kapitel 1.2.2 Client Request-Id auf Seite 7 der Doku.

 

Viel Erfolg!

 

Beste Grüße

Jan-Ove

kevkev
Autor ★
7 Beiträge

Hallo Jan-Ove, 

 

Vielen Dank für deine Antwort. Leider klappt es doch noch nicht so ganz. Ich habe die von dir / auf Seite 7 der Doku genannten Beispiel-Daten für eine sessionId und requestId verwendet. Konkret habe ich folgende zwei Parameter hinzugefügt:

  

# Additional Params
RANDOM_SESSION_ID = '550e8400e29b11d4a716446655440000'
RANDOM_REQUEST_ID = '140113250'

und die GET Request folgendermaßen angepasst:

 

# Get session status
session_url = BASE_URL + '/session/clients/{}/v1/sessions'.format(CLIENT_ID)
session_headers = {
'Accept': 'application/json',
'Authorization': "Bearer {}".format(oauth_access_token),
'x-http-request-info': str({'clientRequestId': {'sessionId': RANDOM_SESSION_ID, 'requestId': RANDOM_REQUEST_ID}}),
'Content-Type': "application/json"
}
session_response = requests.get(session_url, headers=session_headers)
print(session_response)

Leider ist das Resultat immer noch:

<Response [404]>

Irgendwelche Ideen woran es liegen könnte?

 

VG

KS

SMT_Jan-Ove
ehemaliger Mitarbeiter
4.279 Beiträge

Hallo @kevkev,

 

du verwendest deine OAuth-ClientId als ClientId für die session_url. Bitte verwende hier das „user“-Literal wie folgt: GET /session/clients/user/v1/sessions

 

In der Postman-Collection und dem swagger.json findest du Beispiele dafür.

 

Beste Grüße

Jan-Ove

 

bank bot
Autor
6 Beiträge

Ist ein bisschen versteckt. Du kannst sie dir bei der ersten Session Anfrage quasi ausdenken (Siehe 1.2.2). Bei dem Request bekommst du eine session id zurück, die du folgend angeben kannst. Die Request ID sollte innerhalb einer Session eindeutig sein (z.B. timestamp).

Takuan
Einsteiger
1 Beiträge

Hi Jan-Ove,

 

ich habe leider dasselbe Problem. Einen Fehler kann ich leider nicht erkennen. Mein Request schaut wie folgt aus:

>      headers: Object [AxiosHeaders] {
>        Accept: 'application/json',
>        'Content-Type': 'application/json',
>        Authorization: 'Bearer 5fcc19ba-040f-422a-a4f0-0118e88XXXXX',
>        'x-http-request-info': '{"clientRequestId":{"sessionId":"550e8400e29b11d4a716446655440000","requestId":"140113250"}}',
>        'User-Agent': 'axios/1.6.2',
>        'Accept-Encoding': 'gzip, compress, deflate, br'
>      },
>      method: 'get',
>      url: 'https://api.comdirect.de/session/clients/user/v1/sessions',

Ich bekomme einen 404 Fehler.

 

Vielen Dank

SMT_Jan-Ove
ehemaliger Mitarbeiter
4.279 Beiträge