Heute habe ich eine sehr spezielle Frage. In den FPC Packages habe ich entsprechende Units gefunden, Beispiele aus dem Web haben bei mir irgendwie nicht so funktioniert wie ich mir das vorstelle.
Mein Ziel ist es über die Nexar API Bauteiledaten von elektronischen Bauteilen ab zu fragen, Bestelldaten von Lieferanten. Bei Nexar habe ich angefragt ob ich das in meine EXE implementieren darf und die haben zugestimmt. Nun bin ich dabei und habe zum (großen) Teil aus Unwissenheit das ein oder andere Problemchen, schlussendlich es geht nicht.
Wie das geht (ich verstanden habe)
1) Abfrage eines Tokens, der 24h dann gültig ist. Dazu muss man eine "ClientID" und ein "ClientSecret" an eine "TokenURL" URL senden und erhält dann den Token zurück.
2) Eigentliche Datenabfrage mit einer Query (JSON Format)
Mein Problem ist bei 1), also die Token Abfrage klappt nicht, daher geht natürlich 2) auch nicht. Aber erst mal eines lösen.
Am liebsten würde ich dazu "Synapse" verwenden, damit habe ich schon andere API Abfragen incl. SSL gelöst. Ich habe leider kein Beispiel gefunden wie man eine OAuth2 Abfrage mit Synapse macht und alles was ich probiert habe kam nur als Antwort dass die Anfrage ungültig ist. Von Synapse habe ich die aktuelle Sourcen von hier (https://github.com/geby/synapse) geladen und OpenSSL V3.2.1 geht schon mal damit (nach meinem Fix vor ein paar Tagen, der jetzt im GIT schon online ist).
Was ich jedoch gefunden habe sind in den FPC/source/packages/googleapi und habe dies ebenfalls probiert:
Code: Alles auswählen
uses .... googleclient, fpoauth2, fphttpwebclient;
gOAuth2 := TGoogleClient.Create(Self);
gOAuth2.AuthHandler := TOAuth2Handler.Create(Self);
gOAuth2.WebClient := TFPHTTPWebClient.Create(Self);
gOAuth2.Config.AuthMethod := amOAuth2;
gOAuth2.Config.ApplicationName := 'EleLa';
gOAuth2.AuthHandler.Config.ClientID := edClientID.Text;
gOAuth2.AuthHandler.Config.ClientSecret := edClientSecret.Text;
gOAuth2.AuthHandler.Config.TokenURL := 'https://identity.nexar.com/connect/token';
gOAuth2.AuthHandler.Config.AuthURL := 'https://identity.nexar.com/connect/token';
gOAuth2.AuthHandler.Config.AccessType := atOnline;
gOAuth2.AuthHandler.Config.AuthScope := 'supply.domain';
gOAuth2.AuthHandler.Authenticate;
(ClientID/ClientSecret darf ich hier nicht posten, das würde gegen deren Nutzungsbedingungen verstoßen)
Der Versuch mit Synapse:
Basierend auf das Demo von https://support.nexar.com/support/solut ... 1000471994 ganz unten.
Code: Alles auswählen
Var HTTP: THTTPSend;
URLData: string;
Result: Boolean;
procedure WriteStrToStream2(const Stream: TStream; Value: AnsiString);
{$IFDEF CIL}
var
buf: Array of Byte;
{$ENDIF}
begin
{$IFDEF CIL}
buf := BytesOf(Value);
Stream.Write(buf,length(Value));
{$ELSE}
Stream.Write(PAnsiChar(Value)^, Length(Value));
{$ENDIF}
end;
HTTP := THTTPSend.Create;
HTTP.UserAgent:='Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0';
URLData := '"grant_type": "client_credentials", "client_id": "' + edClientID.Text + '", ' +
'"client_secret": "' + edClientSecret.Text + '", "scope": "supply.domain"';
WriteStrToStream2(HTTP.Document, URLData);
Result := HTTP.HTTPMethod('POST', 'https://identity.nexar.com/connect/token');
if Result then
Begin
HTTP.Document.Position := 0;
memAnswer.Lines.LoadFromStream(HTTP.Document);
End;
FreeAndNil(HTTP);
Hier im Forum hatte ich einmal das gefunden:
viewtopic.php?f=26&t=14806
Darauf habe ich so wie in der Nexar Doku steht diesen Link zusammen gebaut:
Code: Alles auswählen
https://identity.nexar.com/connect/token?grant_type=client_credentials&client_id=<geheim>&client_secret=<geheim>&scope=supply.domain
{"error":"invalid_request"}
und nicht den Token.
Vielen Dank für die Hilfe.
VG Markus
PS: Sorry, ein Demo kann ich hier nicht wirklich posten, weil diese ID's ich nicht online stellen darf.