AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi (XE8) RestRequest Post Result 401
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi (XE8) RestRequest Post Result 401

Ein Thema von mlc42 · begonnen am 30. Jan 2017 · letzter Beitrag vom 2. Feb 2017
Antwort Antwort
mlc42

Registriert seit: 9. Feb 2013
130 Beiträge
 
#1

Delphi (XE8) RestRequest Post Result 401

  Alt 30. Jan 2017, 23:13
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
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Delphi (XE8) RestRequest Post Result 401

  Alt 30. Jan 2017, 23:19
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.
Michael Justin

Geändert von mjustin (30. Jan 2017 um 23:22 Uhr)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
659 Beiträge
 
Delphi 12 Athens
 
#3

AW: Delphi (XE8) RestRequest Post Result 401

  Alt 31. Jan 2017, 11:32
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.
  Mit Zitat antworten Zitat
mlc42

Registriert seit: 9. Feb 2013
130 Beiträge
 
#4

AW: Delphi (XE8) RestRequest Post Result 401

  Alt 31. Jan 2017, 21:30
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.
  Mit Zitat antworten Zitat
mlc42

Registriert seit: 9. Feb 2013
130 Beiträge
 
#5

AW: Delphi (XE8) RestRequest Post Result 401

  Alt 1. Feb 2017, 22:20
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
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
659 Beiträge
 
Delphi 12 Athens
 
#6

AW: Delphi (XE8) RestRequest Post Result 401

  Alt 2. Feb 2017, 09:23
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.
  Mit Zitat antworten Zitat
mlc42

Registriert seit: 9. Feb 2013
130 Beiträge
 
#7

AW: Delphi (XE8) RestRequest Post Result 401

  Alt 2. Feb 2017, 21:11
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:14 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