![]() |
Zugriff auf Shopware REST API mit idHTTP
Hallo,
ich würde gerne die REST API von Shopware ( ![]()
Code:
Leider bekomm ich da immer den Response: {"success":false,"message":"Invalid or missing auth"}
var MemoryStream: TMemoryStream;
begin MemoryStream := TMemoryStream.Create; try IdHTTP1.Request.URL := 'http://localhost/api'; IdHTTP1.Request.BasicAuthentication := true; IdHTTP1.Request.Username := 'meinApiUser'; IdHTTP1.Request.Password := 'meinApiKey'; IdHTTP1.get(IdHTTP1.Request.URL, MemoryStream); MemoryStream.Position:=0; Memo1.Lines.LoadFromStream(MemoryStream); finally MemoryStream.Free; end; Wie muss ich den Request aufbauen, dass eine erfolgreiche Anmeldung funktioniert? Danke. mfg christoph |
AW: Zugriff auf Shopware REST API mit idHTTP
Klappt es denn mit dem Browser (IE, Firefox)? Bei GET und Basic Auth kann man damit den Zugriff testen. Einfach die URL eingeben und dann User/Pass im Dialog eingeben.
Das wird auch in der Doku beschrieben: Zitat:
![]() |
AW: Zugriff auf Shopware REST API mit idHTTP
Hallo mjustin,
ja im Browser funktioniert es. Sowohl mit dem Anmelde-Dialog als auch mit ![]() |
AW: Zugriff auf Shopware REST API mit idHTTP
Ist es die aktuelle Indy Version (10.5.9)?
|
AW: Zugriff auf Shopware REST API mit idHTTP
nein, es ist die Version 10.5.7.
Ich hol mir die aktuellste Version und probier es nochmals |
AW: Zugriff auf Shopware REST API mit idHTTP
Das Beispiel
![]() verwendet nicht Basic sondern Digest Authentifizierung. Indy unterstützt Digest, aber dazu muss die Digest-Unit IdAuthenticationDigest eingebunden sein. BasicAuthentication := true; muss weggelassen werden. Genaueres kann man mit Fiddler als HTTP Proxy herausfinden, aber ich tippe es lag daran. Weitere Tipps zum Debuggen sind hier: ![]() |
AW: Zugriff auf Shopware REST API mit idHTTP
Mit Digest Authetifizierung bekomm ich: HTTP/1.1 400 Bad Request
Code:
var MemoryStream: TMemoryStream;
begin MemoryStream := TMemoryStream.Create; try IdHTTP1.Request.URL := 'http://localhost/api'; IdHTTP1.Request.Authentication := TIdDigestAuthentication.Create; IdHTTP1.Request.Authentication.Username := 'meinApiUser'; IdHTTP1.Request.Authentication.Password := 'meinApiKey'; IdHTTP1.get(IdHTTP1.Request.URL, MemoryStream); MemoryStream.Position := 0; Memo1.Lines.LoadFromStream(MemoryStream); finally MemoryStream.Free; end; |
AW: Zugriff auf Shopware REST API mit idHTTP
Zitat:
Falls das nicht geht (wenn Shopware nicht auf einem eigenen Server installiert ist) ann man sich mit Fiddler die Methode ansehen. Bei Digest wird der Server mit einem HTTP Header WWW-Authenticate: Digest realm="testrealm@host.com",... antworten und bei Basic halt mit WWW-Authenticate: Basic ... Die TIdDigestAuthentication.Create; Zuweisung macht Indy selber, der minimale Code wäre (ungetestet):
Code:
IdHTTP1.Request.Authentication.Username := 'meinApiUser';
IdHTTP1.Request.Authentication.Password := 'meinApiKey'; Memo1.Lines.Text := IdHTTP1.get('http://localhost/api'); |
AW: Zugriff auf Shopware REST API mit idHTTP
Digest Auth hab ich mal ausgelesen, verbinden kann ich aber immer noch nicht:
Code:
Digest username="meinApiUser",
realm="Shopware4 REST-API", nonce="dc0e78ffcbef3a87b5e5bfd2719f38e6", algorithm="MD5", uri="/api/", qop="auth", nc=00000001, cnonce="a387e108184985c695c70eb999bd4f9c", response="4ba62efad9e4c33276e342b58128ddea", opaque="d75db7b160fe72d1346d2bd1f67bfd10" |
AW: Zugriff auf Shopware REST API mit idHTTP
Versuch es mal mit
Delphi-Quellcode:
IdHTTP1.Request.BasicAuthentication := False;
|
AW: Zugriff auf Shopware REST API mit idHTTP
@Union:
BasicAuthentication auf False hat nicht geholfen. Ich habe jetzt den Aufruf über den Browser gemacht und mit dem Fiddler mitgeloggt:
Code:
GET http://localhost/api HTTP/1.1
Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Authorization: Digest username="meinApiUser", realm="Shopware4 REST-API", nonce="dae59ac3fd0442669a3afe9ab01d00ed", uri="/api", algorithm=MD5, response="7c44685e2cef635dc86a085b4f799e9d", opaque="d75db7b160fe72d1346d2bd1f67bfd10", qop=auth, nc=00000001, cnonce="082c875dcb2ca740" |
AW: Zugriff auf Shopware REST API mit idHTTP
Zitat:
Firefox verwendet HTTP 1.1 und Keep-Alive, was bei Indy eventuell nicht Standard ist. |
AW: Zugriff auf Shopware REST API mit idHTTP
so schaut der Get Request mit dem Delphi Programm aus:
Code:
Warum sendet es da keine Digest Daten mit?
GET http://localhost/api HTTP/1.1
Connection: keep-alive Host: localhost Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Accept-Encoding: gzip,deflate,sdch, identity Accept-Language: de-AT,de;q=0.8,en-US;q=0.6,en;q=0.4 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) RockMelt/0.16.91.483 Chrome/16.0.912.77 Safari/535.7 |
AW: Zugriff auf Shopware REST API mit idHTTP
Zitat:
Damit der Client weiss, wie man sich anmelden kann (also per Basic, Digest, NTLM oder anderen Verfahren) sendet der Server in seiner Antwort auf das erste GET auch einen Header in dem alle unterstützten Verfahren genannt werden. (Da der Firefox Beispiel weiter oben auch schon die Digest Anmeldedaten enthält, kann es sich nicht um den ersten Request handeln, der hier mit Fiddler geloggt wurde). Um das Problem zu analysieren braucht man die gesamte Kommunikation im Fiddler Protokoll, jeweils für Mozilla und Indy: * erstes GET auf ![]() * die vollständige Response des Servers * zweites GET ![]() * die vollständige Response des Servers Erst im zweiten GET kann man erkennen, ob der Client die vom Server angeforderte Authentifizierungsmethode erkannt hat und benutzt. :idea:Idee: die zweite Response - also nach erfolgreicher Anmeldung - könnte auch einen Redirect Header enthalten. Die IdHTTP HandleRedirects Property muss dann auf True gesetzt sein, damit der Client dem Redirect folgt: ![]() |
AW: Zugriff auf Shopware REST API mit idHTTP
Ich habe bei HTTPOptions die hoInProcessAuth aktiviert und jetzt werden die Digest Auth mitgeschickt:
Code:
Jetzt bekomme ich eine Exception "HTTP/1.1 404 Not Found".
GET http://localhost/api HTTP/1.1
Connection: keep-alive Content-Type: application/json; charset=utf-8 Host: localhost Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Accept-Encoding: gzip,deflate,sdch, identity Accept-Language: de-AT,de;q=0.8,en-US;q=0.6,en;q=0.4 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) RockMelt/0.16.91.483 Chrome/16.0.912.77 Safari/535.7 Authorization: Digest username="meinApiUser", realm="Shopware4 REST-API", nonce="7f4338ced0534cb49bc18082b6553bb3", algorithm="MD5", uri="http://localhost/api", qop="auth", nc=00000001, cnonce="5b6763567f8117e96f0247b701d3e4e3", response="d55a82a9d60bc3cbcc888eccd0a8288c", opaque="d75db7b160fe72d1346d2bd1f67bfd10" Kann es sein, dass es an der uri in der Authorization liegt? Wenn ja, wie kann ich die ändern auf "/api"? |
AW: Zugriff auf Shopware REST API mit idHTTP
ach ich Depp!!
Beim Zugriff über den Browser ![]() Wenn ich allerdings ![]() !!Danke für die Hilfe!! |
AW: Zugriff auf Shopware REST API mit idHTTP
Mich würde interessieren, ob du eine zweite Abfrage ausführen kannst. Bei mir funktioniert zwar der erste Aufruf wunderbar, beim zweiten Aufruf mit der gleichen Abfrage ergibt dann einen Fehler 400 Bad Request.
Eine Untersuchung mit Fiddler zeigte dann, dass nur bei der ersten Abfrage der Digest mitgesendet wird. Beim zweiten Aufruf steht nur "Digest" drin und nichts weiter.
Code:
Die Auth-Routine sieht dann so aus:
procedure TForm1.Button2Click(Sender: TObject);
var s: String; IdHTTP2: TIdHTTP; begin try IdHTTP2 := TIdHTTP.Create(); IdHTTP2.OnAuthorization := Auth; IdHTTP2.HTTPOptions := [hoInProcessAuth]; IdHTTP2.Request.UserAgent := 'Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0'; IdHTTP2.Request.Host := '192.168.1.1'; IdHTTP2.Request.URL := 'http://192.168.1.1/shopware/api/orders/'; IdHTTP2.Request.AcceptLanguage := 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3'; // Erster Aufruf s := IdHTTP2.get(IdHTTP2.Request.URL); Memo1.Lines.Add(s); // Zweiter Aufruf: Fehler 400 s := IdHTTP2.get(IdHTTP2.Request.URL); Memo1.Lines.Add(s); finally IdHTTP2.Free; end; end;
Code:
Beim ersten Aufruf zeigt er im Fiddler die Authorizierung so an:
procedure TForm1.Auth(Sender: TObject; Authentication: TIdAuthentication;
var Handled: Boolean); begin if not (sender is TIdHTTP) then exit; Authentication.Username:='admin'; Authentication.Password:='apipasswort'; if Authentication is TIdDigestAuthentication then begin with Authentication as TIdDigestAuthentication do begin Uri:=(Sender as TIdHTTP).Request.URL; Method:=(Sender as TIdHTTP).Request.Method; end; end; Handled:=True; end;
Code:
Beim zweiten Aufruf fehlt das alles
Authorization: Digest username="admin", realm="Shopware4 REST-API", nonce="174d221165c197bfb342ce5a4feb8504", algorithm="MD5", uri="http://192.168.1.1/shopware/api/orders/", qop="auth", nc=00000001, cnonce="2aff1b184c89e001e311096be805adae", response="73a424ad6d733aa915bb445850e7d448", opaque="d75db7b160fe72d1346d2bd1f67bfd10"
Code:
Normal kann das so nicht richtig sein, da ein Browser sich auch nur einmal authorisieren muss.
Authorization: Digest
|
AW: Zugriff auf Shopware REST API mit idHTTP
Die kompletten HTTP vom Server wären interessant.
Mit
Delphi-Quellcode:
als URL zu arbeiten ist auch nicht ganz sinnvoll, während der Authentisierung wird dieser Wert überschrieben IdHTTP.DoRequest():
IdHTTP2.Request.URL
Delphi-Quellcode:
Vielleicht hilft es schon
wnAuthRequest:
begin Request.URL := AURL; end;
Delphi-Quellcode:
zu setzten.
IdHTTP2.Request.Connection := 'Keep-Alive';
Also du könntest es mal versuchen zwischen den beiden Requests
Delphi-Quellcode:
aufrufen.
IdHTTP2.Request.Authentication.Next
Innerhalb der
Delphi-Quellcode:
gibt es die Authentication Funktion. Die ist ganz interessant.
unit IdAuthenticationDigest
Intern wird über ein Zähler FCurrentStep der aktuelle Schritt gesetzt. Wenn du also deinen ersten Request absetzt, dann wird von der TIdHTTP Komponente über die TIdDigestAuthentication Komponente mittels der Funktion Authentication der Authentication Header erzeugt und FCurrentStep auf 0 gesetzt. Beim nächsten Request ist dann FCurrentStep noch bei 0 und es wird als Authentication Header nur "Digest" zurückgegeben. Am besten du gehst mit dem Debugger mal ganz langsam durch den Code. EDIT: Der nächste Request muss so aussehen, dass du [...] nc=00000002 [...] überträgst: ![]() Zitat:
|
AW: Zugriff auf Shopware REST API mit idHTTP
Zitat:
Ein
Delphi-Quellcode:
zu setzen hat nichts bewirkt, somit kann ich es ersteinmal weglassen. Gruß Ronny.
IdHTTP2.Request.Connection := 'Keep-Alive'
|
AW: Zugriff auf Shopware REST API mit idHTTP
Eigentlich muss das Indy intern aufrufen, also sich selbstständig darum kümmern.
Ich werde das mal versuchen lokal zu reproduzieren und dann im Falle eines Fehlers (wovon ich ausgehe) melden. |
AW: Zugriff auf Shopware REST API mit idHTTP
Falls es hilft, ich arbeite mit Delphi 2007 und benutzte erst die enthaltenen Indys. Auf Grund der Fehler habe ich den Nightly Build geladen und diese ins Delphi integriert. Zwar haben die viele neue Funktionen und Parameter, aber der Fehler mit der Digest Authentifizierung war leider der gleiche.
|
AW: Zugriff auf Shopware REST API mit idHTTP
Liste der Anhänge anzeigen (Anzahl: 1)
Mit den aktuellen Indys klappt es.
Im März 2011 wurde die Digest Implementierung grundlegend ![]() Für die Installation, die nicht ganz so einfach ist, wenn man es das erste mal macht, gibt es ein Tutorial von einem Nutzer hier aus dem Forum ;) ![]() Ich empfehle den aktuellen Stand des trunks zu benutzen, da sich inzwischen unglaublich viel im Vergleich zu D2007 geändert hat! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz