Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi (XE8) RestRequest Post Result 401 (https://www.delphipraxis.net/191590-delphi-xe8-restrequest-post-result-401-a.html)

mlc42 30. Jan 2017 22:13

Delphi (XE8) RestRequest Post Result 401
 
Hallo

ich versuche per RestRequest Daten an die Google API zu senden, bekomme aber leider
einen 401 zurück

{
"error":
{
"errors":
[
{
"domain":"global",
"reason":"required",
"message":"Login Required",
"locationType":"header",
"location":"Authorization"
}
]
,
"code":401,
"message":"Login Required"
}
}



wenn ich diesen Code ausführe

_event := '{"end": {"dateTime": "2017-01-30T09:00:00Z"},"start": {"dateTime": "2017-01-30T08:00:00Z"}}';
ResetRESTComponentsToDefaults;
gettokens(acc,ref);
OAuth2_GoogleTasks.AccessToken := acc;
OAuth2_GoogleTasks.RefreshToken := ref;
RESTClient.BaseURL := 'https://www.googleapis.com/calendar/v3';
RESTClient.Authenticator := OAuth2_GoogleTasks;
RESTRequest.Method := TRESTRequestMethod.rmPOST;
RESTRequest.Resource := '/calendars/primary/events/';
RESTRequest.AddBody(_event, ctAPPLICATION_JSON);
RESTRequest.Execute;


Der sehr ähnliche Aufruf zum löschen benutzt das gleiche OAuth2_GoogleTasks
und klappt dagegen ohne Probleme

function delevent : boolean;
begin
ResetRESTComponentsToDefaults;
gettokens(acc,ref);
OAuth2_GoogleTasks.AccessToken := acc;
OAuth2_GoogleTasks.RefreshToken := ref;
RESTClient.BaseURL := 'https://www.googleapis.com/calendar/v3';
RESTClient.Authenticator := OAuth2_GoogleTasks;
RESTRequest.Method := TRESTRequestMethod.rmDELETE;
RESTRequest.Resource := '/calendars/primary/events/'+EventID;
RESTRequest.Execute;
result := pos('authError',RESTRequest.Response.JSONText)=0;
end;


Leider werde ich aus den Delphi Beispielen bzw der üppigen Hilfe nicht wirklich schlau.
Hat jemand einen Tip wie es richtig geht?

Martin

mjustin 30. Jan 2017 22:19

AW: Delphi (XE8) RestRequest Post Result 401
 
Um den Fehler zu finden, braucht man einen HTTP Proxy (Fiddler2), mit dem man die Requests aufzeichnen kann. Danach vergleicht man die Daten, die jeweils vom Client gesendet wurden.

Um vergleichbare Fälle zu haben, kann man beherzt einen funktionierenden Client einer anderen Platform (Java, C#, PHP ...) einsetzen.

Bbommel 31. Jan 2017 10:32

AW: Delphi (XE8) RestRequest Post Result 401
 
Wo hast du denn das OAuth2_GoogleTasks eigentlich her? Das ist ja bei Delphi nicht dabei, oder?

Spannend wäre die Frage: bekommst du denn im ersten Fall beim Aufruf von "GetTokens(acc,ref)" auch erfolgreich die beiden Tokens zurück? Falls ja, dann bist du ja angemeldet und hast einen Access-Token, mit dem du etwas machen kannst, aber die Anmeldung autorisiert dich dann offensichtlich nicht, das zu tun, was du tun willst. In dem Fall müsstest du mal schauen, was genau in "GetTokens" eigentlich gemacht wird und mit welchem Scope und/oder welcher Audience die Authentifizierungsseite von Google aufgerufen wird. Ggf. werden dort dann die falschen Rechte für dich angefordert.

Hoffe, die Stichworte helfen dir schon mal weiter. Die Google-API-Dokumentation ist da auch recht ausführlich.

mlc42 31. Jan 2017 20:30

AW: Delphi (XE8) RestRequest Post Result 401
 
guter tip
fiddler schau ich mir mal an. Sowas hab ich gesucht um genau zu schauen was Delphi da eigentlich macht.

OAUth2 ist bei Delphi XE8 dabei. Das funktioniert auch ganz gut. Die gettokens ist von mir und holt nur die zuvor angefordeten
Tokens. Ich mache ja mit den gleichen Tokens auch den Delete Aufruf, sollte also authorisiert sein. Im Google API Explorer
kann ich auch ohne weiteres Posts absetzen. Ich vermute das Delphi da irgenwie beim zusammenbau was komisches macht.

Zwischenzeitlich habe ich einen thread in einem anderen Forum gefunden. Da hatte jemand ein ähnliches Problem mit XE8. Der
Code sah so aus wie ich das gemacht habe und soll mit XE5/6 noch gelaufen sein. Leider hat der auch keine Lösung mit XE8 gefunden.

Ich habe auch schon versucht das ganze als UTF8 codierten StringStream zu übergeben. Das gibt aber Zugriffsverletzungen.
Innerhalb der Restkomponenten greift Delphi dann ohne Prüfung auf einen Nil Pointer zu.

Leider hab ich noch kein Beispiel gefunden wie man JSON mit der RestAPI von Delphi versenden kann.
Sonst hätte ich wenigstens einen Ansatz.

mlc42 1. Feb 2017 21:20

AW: Delphi (XE8) RestRequest Post Result 401
 
so gehts dann zumindest mit XE8

ResetRESTComponentsToDefaults;
gettokens(acc,ref);
//OAuth2_GoogleTasks.AccessToken := acc;
//OAuth2_GoogleTasks.RefreshToken := ref;
RESTClient.BaseURL := 'https://www.googleapis.com/calendar/v3';
RESTClient.Authenticator := Nil; //nicht zuweisen !! OAuth2_GoogleTasks;
RESTRequest.Method := TRESTRequestMethod.rmPOST;
RESTRequest.Resource := '/calendars/primary/events/';
RESTRequest.Params.AddItem('Authorization', 'Bearer ' + acc, TRESTRequestParameterKind.pkHTTPHEADER, [poDoNotEncode]); // Bearer selbst einfügen
RESTRequest.AddBody(_event, ctAPPLICATION_JSON);
RESTRequest.Execute;

Sobald man addbody benutzt klappt das Authentifizieren mit OAuth2_GoogleTasks nicht mehr. Was immer Delphi da zusammenbaut.
Ist das jetzt ein Feature von XE8 ?
Na ja Hauptsache es läuft

Bbommel 2. Feb 2017 08:23

AW: Delphi (XE8) RestRequest Post Result 401
 
Ich habe mich in den letzten Wochen auch in die ganzen REST-Geschichten reingearbeitet und zum Üben damit auch die Google-APIs benutzt. Ich hatte dabei bisher auch mit dem OAuth2-Authenticator keine Probleme. Allerdings: erstens habe ich Delphi Seattle und zweitens habe ich bisher nur mit GET Informationen abgerufen, noch nicht selber etwas geschrieben. Das Senden von neuen Einträgen werde ich dann demnächst mal ausprobieren und dann mal berichten, ob Delphi dadurch auch bei mir Probleme mit dem Authenticator bekommt oder ob das ein exklusives "Feature" von XE8 war, das mittlerweile korrigiert wurde. Kann aber noch ein, zwei Wochen dauern - muss mich erst mal um andere Sachen kümmern, aber du hast ja auch einen Workaround. :)

Noch ein Nachtrag zu meiner Frage wegen dem OAuth2_GoogleTasks: dass die Basisklasse für OAuth2 bei Delphi dabei ist, ist mir klar - ich hatte gefragt, weil ich irgendwie den Eindruck hatte, du hättest diese spezielle Google-Variante auch irgendwo gefunden (und ich mir selbst dann neulich Arbeit zu viel gemacht). Keine Ahnung, wo der Eindruck herkam, aber war ja offenbar quatsch. :oops:

mlc42 2. Feb 2017 20:11

AW: Delphi (XE8) RestRequest Post Result 401
 
Ja es wäre interessant zu wissen ob das bei Delphi10 auch so ist.
Es passiert ja auch scheinbar nur wenn man POST mit Addbody verwendet.
Das mit dem OAuth habe ich weitgehend aus dem Rest Demo, bis auf die Sache
mit dem Refreshtoken, die ich hier bereits gepostet hatte.


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