Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   OAuth with IdHTTP vs. Synapse (https://www.delphipraxis.net/172189-oauth-idhttp-vs-synapse.html)

HJay 18. Dez 2012 03:11

OAuth with IdHTTP vs. Synapse
 
Ich versuche gerade, eine Beispielroutine für OAuth-Authentifizierung von der Bibliothek "Synapse" nach "Indy" zu konvertieren.

Code:
procedure TForm1.AuthorizeButtonClick(Sender: TObject); // original by Lukas Gebauer, Ararat Synapse project
var
  http: thttpsend;
  response: string;
  A: TStringStream;
begin
    http := THttpsend.Create;
    http.Protocol := '1.1';
    http.UserAgent := 'DotNetOpenAuth/3.4.6.10357';
    http.Document.position := 0;
    writestrtostream(http.Document, OAuthString);
    http.Document.position := 0;
    http.MimeType := 'application/x-www-form-urlencoded; charset=utf-8';
    http.HTTPMethod('POST', oAuthURL);
    http.Document.position := 0;
    response := readstrfromstream(http.Document, http.Document.Size);
    memo1.Lines.Add(response);
end;
Code:
procedure TForm1.ButtonAuthStringListClick(Sender: TObject);
  var
    AHTTP      : TIdHTTP;
    ARequest   : TStringList;
    AResponse  : String;
begin
  AHTTP := TIdHTTP.Create;

  ARequest := TStringList.Create;
  ARequest.Add(OAuthString);

  AResponse := AHTTP.Post(OAuthURL, ARequest);
  Memo1.Lines.Add(AResponse);

  ARequest.Free;
  AHTTP.Free;
end;
Während die Synpase-Version mit dem gleichen OAuthString tadellos funktioniert, gibt die Indy-Version leider eine OAuth-Fehlermeldung zurück: "oauth_error_message=Error while reading message DotNetOpenAuth.OAuth.Messages.UnauthorizedTokenReq uest..."

Kennt jemand zufällig sowohl Synapse als auch Indy und kann sagen, woran das liegen kann?

CCRDude 18. Dez 2012 07:03

AW: OAuth with IdHTTP vs. Synapse
 
Ich kenne beides, habe mit beiden schon OAuth probiert (und kenne keine perfekte Implementierung, leider treten Fehler manchmal recht spät auf). Meine eigenen Versuche sind leider nur GET, nicht POST, aber spontan würde ich auf den offensichtlichsten Unterschied tippen: der MimeType, für die Interpretation von POST-Daten essentiell, und wie der Default by Indy ist (und ob der sich noch von 9 zu 10 unterscheidet), weiß ich nicht, der Sicherheit halber würde ich ihn immer manuell spezifizieren.

Außerdem verwendet Indy HTTP 1.0 und nicht 1.1 für POSTs (wenn Du kein spezielles Flag setzt), wobei ich die RFC nicht im Kopf habe, da kannst Du aber auch mal nachlesen, ob das einen Unterschied machen könnte.

HJay 18. Dez 2012 10:10

AW: OAuth with IdHTTP vs. Synapse
 
Danke für die schnelle Antwort. Leider kenne ich mich mit Indy wirklich nicht aus. Wo und wie kann ich denn den Mime-Typ setzen?

HTTP 1.0 vs 1.1 habe ich ausprobiert, das folgende bringt keine Verbesserung:

Code:
  AHTTP := TIdHTTP.Create;
  AHTTP.ProtocolVersion := pv1_1;
  AHTTP.HTTPOptions := AHTTP.HTTPOptions + [hoKeepOrigProtocol];

HJay 18. Dez 2012 10:20

AW: OAuth with IdHTTP vs. Synapse
 
Ich habe es mit TSTringStream und TStringList ausprobiert. Beide ergeben inzwischen die gleiche oauth_error_message.

Was ist denn besser geeignet, um die richtige Zeichenkodierung durchzuziehen?

Code:
...
OAuthString :AnsiString;
...

procedure TForm1.ButtonAuthStreamClick(Sender: TObject);
 var
    AHTTP      : TIdHTTP;
    AStream    : TStringStream;
    AResponse  : String;
begin
  AHTTP := TIdHTTP.Create;
  AHTTP.HandleRedirects := True;
  AHTTP.ProtocolVersion := pv1_1;
  AHTTP.HTTPOptions := AHTTP.HTTPOptions + [hoKeepOrigProtocol];
  AHTTP.Request.ContentType := 'application/x-www-form-urlencoded; charset=utf-8';

  AStream  := TStringStream.Create(OAuthString);
  AResponse := AHTTP.Post(OAuthURL, AStream);
  Memo1.Lines.Add(AResponse);

  AStream.Free;
  AHTTP.Free;
end;

procedure TForm1.ButtonAuthStringListClick(Sender: TObject);
  var
    AHTTP      : TIdHTTP;
    ARequest   : TStringList;
    AResponse  : String;
begin
  AHTTP := TIdHTTP.Create;
  AHTTP.ProtocolVersion := pv1_1;
  AHTTP.HTTPOptions := AHTTP.HTTPOptions + [hoKeepOrigProtocol];
  AHTTP.Request.ContentType := 'application/x-www-form-urlencoded; charset=utf-8';

  ARequest := TStringList.Create;
  ARequest.Add(OAuthString);

  AResponse := AHTTP.Post(OAuthURL, ARequest);
  Memo1.Lines.Add(AResponse);

  ARequest.Free;
  AHTTP.Free;
end;

CCRDude 18. Dez 2012 10:29

AW: OAuth with IdHTTP vs. Synapse
 
writestrtostream erwartet einen AnsiString, konvertiert ggfls..

Du verwendest 2010, ist Dein OAuthString evtl. kein AnsiString/RawByteString? Warum übergibst Du dem constructor des TStringStream kein Encoding? Erwartet der Server UTF-8, oder verwendest Du das nur "zufällig" im Synapse-Beispiel, sonst müsstet Du auch diesbzgl. schauen.

HJay 18. Dez 2012 10:38

AW: OAuth with IdHTTP vs. Synapse
 
OK, es klappt jetzt. Lag wohl tatsächlich an ContentType,userAgent und Protocol in irgendeiner Kombination. *puh*

Vielen Dank für Deine Hilfe! Du hast mich auf den richtigen Pfad gebracht...

...jetzt auf zu den nächsten Schritten im OAuth-Prozess...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 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