22. Januar 2024 19:11
Moin,
wegen der neuen
Plattformrichtline darf ich aktuell die API anbinden bzw. dann auch die Daten entsprechend aufbereiten.
Nachdem ich es endlich geschafft habe ein Token zu generieren (eine Qual mit der Signierung), scheitere ich nun direkt am nächsten Punkt.
Folgende Dokumentation gibt es
https://www.bzst.de/DE/Service/Portalin ... _node.htmlDort ist dann auch das Vorgehen grob beschrieben. Auf jeden Fall zum Problem. Ich erhalte das Token zurück und speichere es mir ab.
Falls ich nun per API-Test-Tool oder Fiddler die Abfrage an mds-ktst.bzst.bund.de/dip/start/DAC7 mache, funktioniert es mit dem Token einwandfrei.
Raw Request von Fiddler z. B.
- Code:
POST https://mds-ktst.bzst.bund.de/dip/start/DAC7 HTTP/2
Host:mds-ktst.bzst.bund.de
Authorization:Bearer xxxxxx
Wenn ich das gleiche aber in NAV mit dem HttpClient versuche, erhalte ich eine 401 Fehlermeldung:
- Code:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested. Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>
Als Header gebe ich nur das Token an wie auch im ersten Beispiel zu Fiddler. Testweise habe ich auch mal Host hinzugefügt. HttpClient scheint nicht so einfach ein RAW rauszurücken.
Code ist zusammengedampft aus den Funktionen ca. so
- Code:
HttpClientBZSt := HttpClientBZSt.HttpClient;
HttpClientBZSt.BaseAddress := UriBZSt.Uri('https://mds-ktst.bzst.bund.de');
HttpClientBZSt.DefaultRequestHeaders.Clear;
HttpClientBZSt.DefaultRequestHeaders.Add('Host', 'mds-ktst.bzst.bund.de');
HttpClientBZSt.DefaultRequestHeaders.TryAddWithoutValidation('Authorization', STRSUBSTNO('%1 %2', 'Bearer', GlobalTokenBzst)); // Variable ist auch gefüllt mit dem richtigen Token, getestet per MESSAGE(FORMAT(HttpClientBZSt.DefaultRequestHeaders));
HttpResponseMessage := HttpClientBZSt.PostAsync('/dip/start/DAC7', HttpContentPar).Result; // HttpContentPar ist dabei eine leere Variable, weil es keinen Content gibt
ResultStringPar := HttpResponseMessage.Content.ReadAsStringAsync.Result; // MESSAGE darauf ergibt dann obige Fehlermeldung
Vielleicht hat jemand eine Idee?
#EDIT
Ich habe nach blöden Problemen mit Fiddler "The remote certificate is invalid according to the validation procedure" endlich den Request geloggt bekommen. Dazu habe ich auf dem NST
https://bizzbrainblog.wordpress.com/201 ... -with-nav/ befolgt, dann den Port in Fiddler geändert und im Code noch folgendes benötigt (um besagten Fehler loszuwerden für Tests - natürlich niemals für produktiv):
- Code:
HttpClientHandlerBzst := HttpClientHandlerBzst.HttpClientHandler;
HttpClientHandlerBzst.ServerCertificateCustomValidationCallback := HttpClientHandlerBzst.DangerousAcceptAnyServerCertificateValidator;
HttpClientBZSt := HttpClientBZSt.HttpClient(HttpClientHandlerBzst);
Dann habe ich jetzt entdeckt, dass scheinbar gar kein Bearer mitgegeben wird?? Ich verstehe nicht warum, weil oben die Message wirft bei den Headern genau diesen raus. Es muss also beim Senden einfach abgeschnitten werden o. ä.
Demnach ist die Response folgende:
- Code:
Bearer error="invalid_request", error_description="No bearer token found in the request"
Also muss ich irgenwie herausfinden wieso das Weggeworfen wird und das verhinden. Auch gerne Tipps, wenn es jemandem nicht unbekannt scheint, während ich weiter forsche.
#EDIT2
Letzteres hat mich nochmal meine Existenz hinterfragen lassen. Nachdem klar war, dass der Header weg war, konnte ich die Suche stark eingrenzen. Der Beispielcode hätte auch nicht geholfen, da der Fehler in einem nicht vorgehaltenen Teil war. Ich frage nämlich direkt vom Request ab, ob der Client initialisiert ist mittels globalem Bool, das ich beim Initialisieren setze. Ich habe aber Copy&Paste gemacht aus vorherigen Clients von uns und dabei versehentlich ein isInitializedAndererClient genommen und auf TRUE gesetzt. Demnach war das isInitializedBZSt immer auf FALSE und der hat mir jedes Mal einen neuen Client erstellt direkt vor dem Request abfeuern. Wieso das beim Token widerum funktioniert hinterfrage ich erst gar nicht.
Damit ist das Thema gelöst, hat mich auch nur 1.5 Tage Nerven gekostet :)