Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Mit Rest-Komponenten auf Shopware-API zugreifen (https://www.delphipraxis.net/189866-mit-rest-komponenten-auf-shopware-api-zugreifen.html)

Guido R. 1. Aug 2016 18:01

Mit Rest-Komponenten auf Shopware-API zugreifen
 
Hallo !
Ich habe mir eine Testumgebung mit Shopware 5.X geschaffen und möchte auf dessen Rest Schnittstelle zugreifen.
Dazu habe ich einen Benutzer mit den entsprechenden Rechten angelegt. Im Webbrowser erhalte ich, nach Eingabe von Username und dem von Shopware erstellten Key, für die entsprechende Adresse (z.B. meinshop.de/api/articles) das erwartete Ergebnis im JSON-Format.

Unter Delphi komme ich mit den REST Client Komponenten aber an der Authentifizierung nicht vorbei.
Gleiches gilt für den Rest Debugger. Auch dort erhalte ich als Antwort nur :
Code:
{
  "success":false,
  "message":"Invalid or missing auth"
}
egal welche Einstellungen ich auch für die Authentifizierung probiert habe.

Hat dies bereits jemand zum laufen gebracht? Für etwas Hilfe wäre ich hier sehr dankbar!

Guido

RWarnecke 1. Aug 2016 19:19

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
Schau mal hier, vielleicht hilft ja das weiter. Ist zwar nur von Shopware 4.

himitsu 2. Aug 2016 09:23

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
Also, der Doku zu Folge wäre rein garnichts zu beachten,
https://developers.shopware.com/deve...-in-your-own-a
https://developers.shopware.com/deve...the-api-client
aber sowas schonmal probiert? (hilft aber scheinbar nur, wenn PHP als CGI eingebunden ist)
http://internet-marketing-dresden.de.../vorbereitung/ > Probleme mit der Authentifizierung mit der REST API

und
http://www.delphipraxis.net/171695-z...-idhttp-3.html

Guido R. 2. Aug 2016 13:09

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
Hallo !

Die Anleitung von Franke OM hatte ich im Prinzip schon umgesetzt. Auch bei einem Strato vServer ist
Code:
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
erforderlich um überhaupt Zugriff auf die API zu bekommen.
Selbst wenn ich nur den Rest-Debugger verwende (URL, Ressource "articles", Authentifizierung "Basic" mit Username und Key) erhalte ich "Invalid or missing auth".
rufe ich die selber URL/articles auf und bestätige mit Username und Key, so erhalte ich eine korrekte Antwort...

In dem Beitrag hier auf der DP wird darauf verwiesen, dass es sich bei der Authentifizierungsmethode um "Digest" handelt. Wie könnte ich das denn mit den Rest-Komponenten umsetzen?

Daniel 2. Aug 2016 13:11

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
Schalte doch mal einen Proxy wie Fiddler dazwischen.
Damit kannst Du Dir Anfrage und Antwort des Browsers und Deines Programms im Klartext anzeigen lassen. Auf diese Weise kommt man so einem Problem gut auf die Spur.

Guido R. 2. Aug 2016 15:39

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
Fiddler war schonmal eine gute Idee, insofern dass es bestätigt hat, dass es sich um eine Digest-Auhorization handelt...
Code:
No Proxy-Authorization Header is present.

Authorization Header is present: Digest username="api",realm="Shopware REST-API",nonce="d7cbb7df02fd50d7c3212ab40e4e5396",uri="/shopware/api/articles",cnonce="8f18815a16791289452285734f17210a",nc=00000002,algorithm=MD5,response="a523ab46510c967397f2638b2bc4987c",qop="auth",opaque="d75db7b160fe72d1346d2bd1f67bfd10"
Nur wie bekomme ich das jetzt den Rest-Komponenten beigebracht ??? :gruebel:

Daniel 2. Aug 2016 15:47

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
Du müsstest bei Fiddler bei Deinem Web-Browser mindestens zwei Requests sehen. Zuerst fragt der Web-Browser OHNE Authentifizierungsdaten an. Er bekommt dann eine Antwort mit dem Statuscode 401, aber auch mit einem vom Server erzeugten Wert. Diesen verfuddelt der Client dann mit Benutzername und Passwort (ala
Delphi-Quellcode:
MD5(username+';'+servervalue+';'+password)
) und sendet das dann als Anmeldung zurück.

Diesen Ablauf wirst Du mit den REST-Komponenten nachbauen müssen. Die OAuth-Geschichten zum Beispiel sind ja auch ein Pingpong zwischen Client und Server. Ich würde mal schauen, ob man im Netz zum Beispiel für PHP oder dgl. ein paar Beispiele findet. Ich habe den Wikiedia-Artikel nur überflogen, aber das scheint lediglich eine Fleißaufgabe zu sein, da alle Algorithmen in Delphi vorhanden sind.

Daniel 2. Aug 2016 16:18

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
https://evertpot.com/223/

Das sieht ganz gut aus.

himitsu 2. Aug 2016 16:21

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
Zitat:

No Proxy-Authorization Header is present.
Das klingt doch nach dem Grund, warum es nicht mit Proxy-Authorization geht?
Der kann den Header nicht mehr setzen, da der Header schon vorhanden und gesendet ist.

Es klingt zumindestens nach dem einen viel zu beliebten Problem in der PHP-Welt. :stupid:
Zitat:

Zitat von x-beliebiges Beispiel
Warning: Cannot modify header information - headers already sent by (output started at /some/file.php:12) in /some/file.php on line 23


mquadrat 3. Aug 2016 06:34

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
Bei den Indys muss man Digest explizit einschalten. Ich kann mal nachschauen, wenn ich im Büro bin.

Guido R. 3. Aug 2016 12:44

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
Mit den Indys geht es relativ einfach...
Delphi-Quellcode:
procedure TRestForm.GetArticlesButtonClick(Sender: TObject);
var MS : tMemoryStream;
begin
 MS := tMemoryStream.Create;
 
 idHttp1.Request.BasicAuthentication := false;
 idHttp1.HTTPOptions := idHttp1.HTTPOptions + [hoInProcessAuth];  // <- Ohne das schlägt es fehl !!!
 idHTTP1.Request.Username := UsernameEdit.Text;
 idHTTP1.Request.Password := KeyEdit.Text;
 idHTTP1.Get(URLEdit.Text+'/articles', MS);
 
 MS.Position := 0;
 ResponseMemo.Lines.LoadFromStream(MS);
 FreeAndNil(MS);
end;
Einer Umsetzung mit den Delphi-REST-Komponenten bin ich damit aber keinen Schritt näher... :wall:

Guido R. 5. Aug 2016 20:47

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
Ich setze das ganze im Moment mit den Indys um und das funktioniert auch wunderbar, aber es wurmt mich dennoch, dass ich das nicht mit den REST-Komponenten umgesetzt bekomme. Ich habe auch keinen echten Ansatz, da bei vielen Funktionen, die mir weiterhelfen könnten in der Hilfe nur :
"Embarcadero Technologies verfügt zurzeit über keine zusätzlichen Informationen. Bitte unterstützen Sie uns bei der Dokumentation dieses Themas, indem Sie Ihre Kommentare auf der Diskussionsseite eingeben."
steht. "Rate mal wie's funktioniert" finde ich ein echt blödes Konzept :(

gubbe 12. Feb 2017 16:14

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
Ich habe auch schon länger versucht mit Delphi auf die Shopware-API zuzugreifen. Die Rest-Komponenten von Delphi bieten leider keinen "TDigestAuthenticator", um die von Shopware verwendete Digest-Authentifizierung zu unterstützen.

Aber Delphi verwendet ja inzwischen die systemspezifischen HTTP-Kompontenen für die Rest-Zugriffe, unter Windows also WinHTTP. Das beherrscht im Prinzip die Digest-Methode. Das Dumme ist nur, dass man man über die Rest-Komponenten (RestClient und RestRequest) nicht an die verwendeten HTTP-Komponenten herankommt, da diese als Private deklariert sind. Man hat also keine direkte Chance, die Zugangsdaten für WinHTTP zu setzen.

Man könnte jetzt probieren, über irgendwelche Hacks an die Privaten Eigenschaften zu kommen, ich habe aber eine einfachere Möglichkeiten gefunden und zeige es am Beispiel des Delphi RestDebuggers:

Man übergibt die Zugangsdaten in der URL:

Code:
http://benutzername:apikey@www.server.de/api
Das Problem ist dabei allerdings, dass die so gesetzten Zugangsdaten unterwegs verloren gehen. Schuld ist der Aufruf von URLEncode in "procedure TCustomRESTRequest.Execute". Diese entfernt die Zugangsdaten.
Das lässt sich jedoch verhindern, indem man im Restdebugger in "procedure Tfrm_Main.DoExecuteRequest;" vor dem Execute angibt, dass die URL bereits kodiert ist:

Code:
try
    RestRequest.URLAlreadyEncoded := true;
    RESTRequest.Execute;
  except
Die URL muss man jetzt ggf. selbst kodieren.

Damit funktioniert jetzt der Aufruf der Shopware-API mit dem RestDebugger (zumindest unter Windows).

Der Vollständigkeit halber sei noch erwähnt, dass man alternativ auch im Quellcode von Shopware die Authentifizierungsmethode ändern kann:
https://forum.shopware.com/discussio...tatt-digest/p1

Für die nächste Version gibt es auch ein Ticket dazu:
https://issues.shopware.com/issues/SW-16133
Damit wird hoffentlich auch bald offiziell Basic-Auth umgesetzt

sahimba 12. Feb 2017 16:42

AW: Mit Rest-Komponenten auf Shopware-API zugreifen
 
Zitat:

Zitat von gubbe (Beitrag 1361368)
Code:
try
    RestRequest.URLAlreadyEncoded := true;
    RESTRequest.Execute;
  except

Das könnte ja fast dasselbe/ähnliche Problem wie bei mir sein:
http://www.delphipraxis.net/191701-t...ml#post1361347

Und jetzt hab ich schon umgebaut :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz