Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Google API Zugriff mit OAuth 2.0 Authorization für Daraja HTTP Server (mit Source) (https://www.delphipraxis.net/199946-google-api-zugriff-mit-oauth-2-0-authorization-fuer-daraja-http-server-mit-source.html)

mjustin 4. Mär 2019 14:37

Google API Zugriff mit OAuth 2.0 Authorization für Daraja HTTP Server (mit Source)
 
Da ich zum Thema OAuth 2.0 Authorization hier ab und zu etwas gelesen habe, aber Beispielprojekte für eine serverseitige Umsetzung in Object Pascal fehlten, habe ich heute anhand der Google Dokumentation zum Einsatz von OAuth 2.0 auf Web Servern ein Beispielprojekt erstellt:

Google API access with OAuth 2.0 authorization for Daraja HTTP Server Applications (full source code)

Das Programm kann mit Lazarus 2.0 und mit Delphi 2009 und neuer kompiliert werden.

Neben der IDE und einem Google Account mit Zugang zur Developer API sind nur OpenSSL DLLs und SuperObject (für Delphi) erforderlich.

Feedback ist natürlich sehr herzlich willkommen.

TurboMagic 4. Mär 2019 22:04

AW: Google API Zugriff mit OAuth 2.0 Authorization für Daraja HTTP Server (mit Source
 
Danke für's tun!

Rollo62 5. Mär 2019 07:33

AW: Google API Zugriff mit OAuth 2.0 Authorization für Daraja HTTP Server (mit Source
 
Sehr schön, das ist immer wieder ein Thema.
Laufen diese Komponenten auch unter Firemonkey (Android, iOS, MAC) ?
Ich denke das ist VCL, oder gibt es davon auch FMX Versionen ?

mjustin 5. Mär 2019 07:41

AW: Google API Zugriff mit OAuth 2.0 Authorization für Daraja HTTP Server (mit Source
 
Zitat:

Zitat von Rollo62 (Beitrag 1426966)
Sehr schön, das ist immer wieder ein Thema.
Laufen diese Komponenten auch unter Firemonkey (Android, iOS, MAC) ?
Ich denke das ist VCL, oder gibt es davon auch FMX Versionen ?

VCL und FireMonkey sind reine Oberflächen-Bibliotheken, diese werden nur clientseitig eingesetzt.

Der Daraja HTTP Server basiert auf Indy's HTTP Server Komponente und erleichtert zur Erstellung von Webververn. Auf diese wird dann mit HTTP Clients zugegriffen (also einem Browser oder einem WebService Clients).

Die Oberfläche wird daher bei Einsatz eines Webbrowsers über HTML definiert, oder - wenn man einen WebService erzeugt - entfällt diese ganz, oder man schreibt eine Oberfläche die aus den Daten des WebService gespeist wird. Da für die Google-Anmeldung (ausser unter Android) jedoch immer eine Benutzerinteraktion im Browser notwendig ist, kann sie für WebServices so nicht ohne weiteres eingesetzt werden.

Laufen würde dieser Code mit Delphi (Rio) auch unter Linux, aber wegen ARC nicht auf iOS, Mac oder Android.

mjustin 5. Mär 2019 08:15

AW: Google API Zugriff mit OAuth 2.0 Authorization für Daraja HTTP Server (mit Source
 
Vielen Dank für das Feedback soweit!

Ich hoffe, als nächstes den Code für das Verfahren Using OAuth 2.0 for Server to Server Applications bauen zu können. Da ich nicht auf Google festgelegt bin wäre ich auch an anderen OAuth 2.0 Integrationen interessiert und für Vorschläge offen, auf welche Provider (Dienstanbieter) ein Zugriff interessant wäre. Voraussetzung ist nur dass es kostenlose Dienste mit guter Dokumentation sind.

TurboMagic 6. Mär 2019 17:23

AW: Google API Zugriff mit OAuth 2.0 Authorization für Daraja HTTP Server (mit Source
 
Ich verstehe die Antwort noch nicht ganz: könnte man den OAuth Code ausdem Server
extrahieren und eine VCL oder FMX Anwendung bauen, welche diesen Code benutzt um
sich mittels OAuth 2.0 bei einem entsprechenden Dienst der das unterstützt anzumelden?

Oder muss man unbedingt eine Webseite bauen? Wozu?
Wird da nicht erstmal irgendwo Benutzername/Passwort abgefragt und dann ein Token
generiert und die eigene Anwendung weißt sich dann mit diesem Token gegenüber dem
Server aus?

Grüße

TurboMagick

mjustin 6. Mär 2019 18:03

AW: Google API Zugriff mit OAuth 2.0 Authorization für Daraja HTTP Server (mit Source
 
Zitat:

Zitat von TurboMagic (Beitrag 1427115)
Ich verstehe die Antwort noch nicht ganz: könnte man den OAuth Code ausdem Server
extrahieren und eine VCL oder FMX Anwendung bauen, welche diesen Code benutzt um
sich mittels OAuth 2.0 bei einem entsprechenden Dienst der das unterstützt anzumelden?

Oder muss man unbedingt eine Webseite bauen? Wozu?
Wird da nicht erstmal irgendwo Benutzername/Passwort abgefragt und dann ein Token
generiert und die eigene Anwendung weißt sich dann mit diesem Token gegenüber dem
Server aus?

Das Token hat nur eine befristete Gültigkeit, es muss daher regelmäßig aktualisiert werden.

Wie aber bekommt man das Token dann vom Server in die VCL/FMX Anwendung?

Natürlich, wenn man den Server auf dem gleichen System wie die Anwendung laufen lassen kann, kein Problem - aber nicht immer ist das eine "vertrauenswürdige Umgebung".

Und: der Server benötigt eine client_id und ein client_secret, ohne die man kein Token bekommt. Beide soll man geheim halten.
Wenn die Anwendung (einschliesslich Server) auf dem Desktop des Endanwenders läuft, gibt man private Schlüssel aus der Hand, was missbraucht werden kann.

TurboMagic 6. Mär 2019 22:23

AW: Google API Zugriff mit OAuth 2.0 Authorization für Daraja HTTP Server (mit Source
 
Hallo,

danke für den Erklärungsversuch. Nur ist das noch so Neuland für mich, dass ich doch nochmal nachfragen muss.

Beiuspiel: ein Server der bestimmte Webservices anbietet und den ich nicht unter meiner Kontrolle habe
(beispielsweise GitHub) erfordert für die API Benutzung Authentifizierung und kann das per OAuth 2.0.

Wenn ich eine VCL/FMX App schreiben wollte die diese APIs nutzt, müsste ich irgendwelche Anmeldeinformationen
(z.B. Benutzername/Passwort) an den Server schicken (wie? definiert OAuth das?) und würde wenn ich's richtig
verstanden habe ein Token bekommen, welches für einen begrenzten Zeitraum gültig ist. Richtig?

Vermutlich ist im Token vermerkt bis wann bzw. wie lange es gültig ist.

Dieses Token muss ich bei den entsprechenden Aufrufen mitschicken, sonst sagt der angefragte Server nur:
"keine Berechtigung". Richtig?

Und ich könnte aufpassen wann das Token abläuft um mit den gemerkten Logindaten rechtzeitig ein neues
anzufordern. Richtig?

Token und Logindaten würde ich vorzugsweise im Speicher der Anwendung halten, da andere Anwendungen dann
schwerer dran kommen als an eine Datei. Richtig?

Oder wozu bräuchte ich dann noch einen Server unter meiner Kontrolle?

Grüße und Danke für's Erklären

TurboMagick

mjustin 7. Mär 2019 07:40

AW: Google API Zugriff mit OAuth 2.0 Authorization für Daraja HTTP Server (mit Source
 
Zitat:

Zitat von TurboMagic (Beitrag 1427137)
Beiuspiel: ein Server der bestimmte Webservices anbietet und den ich nicht unter meiner Kontrolle habe
(beispielsweise GitHub) erfordert für die API Benutzung Authentifizierung und kann das per OAuth 2.0.

Für die Zugriffe auf die API mit den eigenen Benutzeranmeldedaten ist kein OAuth 2.0 notwendig. Wenn Du nur auf deine eigene Daten per API zugreifen willst bietet GitHub auch einfachere Wege an).

OAuth 2.0 ist für Third-Party-Apps, die auf auf Daten zugreifen wollen die nicht ihnen gehören. Diesen vertraut man dann nicht die eigenen GitHub-Anmeldedaten an.

Beispiel: ich biete eine Quelltextformatierung für deine bei GitHub gespeicherten Quelltexte an, als sogenannte "Third-Party-App".

Damit ich aber auf die GitHub-Daten deines Kontos zugreifen darf, bitte ich dich zuerst um eine Anmeldung und Authorisierung über GitHub per OAuth 2.0. Von GitHub erhalte ich dann Zugang zu deinen Daten. Allerdings nicht deinen Benutzernamen/Passwort, sondern nur ein Token.

In deinem GitHub-Konto kannst Du dann sehen, dass du meiner App die Berechtigung erteilt hast auf deine Repositories zuzugreifen.


Zitat:

Zitat von TurboMagic (Beitrag 1427137)
Wenn ich eine VCL/FMX App schreiben wollte die diese APIs nutzt, müsste ich irgendwelche Anmeldeinformationen
(z.B. Benutzername/Passwort) an den Server schicken (wie? definiert OAuth das?) und würde wenn ich's richtig
verstanden habe ein Token bekommen, welches für einen begrenzten Zeitraum gültig ist. Richtig?

Richtig: wenn man sich per OAuth 2.0 anmelden will, zeigt dein Webbrowser eine Loginmaske und wenn Du deine Anmeldedaten sendest, erhält dein Browser einen HTTP Redirect zurück, d.h. er soll auf eine Seite gehen die der Third-Party-Anbieter bei GitHub hinterlegt hat. (Redirects werden von OAuth extensiv genutzt - siehe RFC 6749 Spezifikation)

Zum Beispiel:

http://beautifulsourcecode.com/oauthcallback


Zitat:

Zitat von TurboMagic (Beitrag 1427137)
Vermutlich ist im Token vermerkt bis wann bzw. wie lange es gültig ist.

Dieses Token muss ich bei den entsprechenden Aufrufen mitschicken, sonst sagt der angefragte Server nur:
"keine Berechtigung". Richtig?

Und ich könnte aufpassen wann das Token abläuft um mit den gemerkten Logindaten rechtzeitig ein neues
anzufordern. Richtig?

Token und Logindaten würde ich vorzugsweise im Speicher der Anwendung halten, da andere Anwendungen dann
schwerer dran kommen als an eine Datei. Richtig?

Ja, so ist es.

Zitat:

Zitat von TurboMagic (Beitrag 1427137)
Oder wozu bräuchte ich dann noch einen Server unter meiner Kontrolle?

Für die Anmeldung ist ein Server erforderlich, an den das Token gesendet wird.

In meiner Demo-Anwendung läuft der auf localhost. GitHub ruft also die Adresse http://localhost/oauthcallback auf. Diese sogenannte 'return_uri' Adresse habe ich bei GitHub in den OAuth Einstellungen meiner App eingetragen. Für den Echtbetrieb würde ich, falls ich tatsächlich einen Quelltextformatierer anbieten würde, die oben genannte http://beautifulsourcecode.com/oauthcallback als return_uri eintragen.



Wenn auf dem Rechner aber kein Server laufen würde, geht der HTTP Redirect ins Leere.

Um ein lebensnahes Beispiel zu verwenden: der Pizza-Bote kann die Lieferung (Token) nicht abgeben, weil ich eine falsche Adresse angegeben habe.

TurboMagic 7. Mär 2019 17:07

AW: Google API Zugriff mit OAuth 2.0 Authorization für Daraja HTTP Server (mit Source
 
Danke schon mal für die Antworten, auch wenn ich noch nicht alles ganz verstehe oder sinnvoll finde.

Zitat:

Zitat von TurboMagic (Beitrag 1427137)
Wenn ich eine VCL/FMX App schreiben wollte die diese APIs nutzt, müsste ich irgendwelche Anmeldeinformationen
(z.B. Benutzername/Passwort) an den Server schicken (wie? definiert OAuth das?) und würde wenn ich's richtig
verstanden habe ein Token bekommen, welches für einen begrenzten Zeitraum gültig ist. Richtig?

Zitat:

Zitat von mjustin (Beitrag 1427155)
Richtig: wenn man sich per OAuth 2.0 anmelden will, zeigt dein Webbrowser eine Loginmaske und wenn Du deine Anmeldedaten sendest, erhält dein Browser einen HTTP Redirect zurück, d.h. er soll auf eine Seite gehen die der Third-Party-Anbieter bei GitHub hinterlegt hat. (Redirects werden von OAuth extensiv genutzt - siehe RFC 6749 Spezifikation)

=> Eigentlich müsste das nicht zwingend eine Webseite sein, wenn man OAuth in einer eigenen App nutzen wollte, sondern könnte ein FMX Benutzername/Passwort Formular sein,
der die Daten dann in der richtigen Form an die GitHub Webseite sendet. Allerdings müsste man dann vermutlich Änderungen an der Loginseite von GitHub nachziehen, falls diese
relevant sein sollten für den eigentlichen Login Prozess. Dann würde mann eine Redirect URL als Antwort bekommen. Aber was soll man dann auf der anderen Seite?
Ist das sozusagen die eigentliche Webanwendung die man ausführen wollte?

Zitat:

Zitat von mjustin (Beitrag 1427155)

Dein Beispiel bringt bei mir nur die Telekom navigations Hilfeseite :-(
Wenn ich dich weiter unten aber richtig verstehe war es eh' ein nicht wirklich umgesetztes Beispiel.

Zitat:

Zitat von mjustin (Beitrag 1427155)
Zitat:

Zitat von TurboMagic (Beitrag 1427137)
Vermutlich ist im Token vermerkt bis wann bzw. wie lange es gültig ist.

Dieses Token muss ich bei den entsprechenden Aufrufen mitschicken, sonst sagt der angefragte Server nur:
"keine Berechtigung". Richtig?

Und ich könnte aufpassen wann das Token abläuft um mit den gemerkten Logindaten rechtzeitig ein neues
anzufordern. Richtig?

Token und Logindaten würde ich vorzugsweise im Speicher der Anwendung halten, da andere Anwendungen dann
schwerer dran kommen als an eine Datei. Richtig?

Ja, so ist es.

Zitat:

Zitat von mjustin (Beitrag 1427155)
Zitat:

Zitat von TurboMagic (Beitrag 1427137)
Oder wozu bräuchte ich dann noch einen Server unter meiner Kontrolle?

Für die Anmeldung ist ein Server erforderlich, an den das Token gesendet wird.

Warum braucht es dazu einen Server? Hätte man das Token nicht einfach an den anforderer des Tokens in der HTTP Response schicken können?

Zitat:

Zitat von mjustin (Beitrag 1427155)
In meiner Demo-Anwendung läuft der auf localhost. GitHub ruft also die Adresse http://localhost/oauthcallback auf. Diese sogenannte 'return_uri' Adresse habe ich bei GitHub in den OAuth Einstellungen meiner App eingetragen. Für den Echtbetrieb würde ich, falls ich tatsächlich einen Quelltextformatierer anbieten würde, die oben genannte http://beautifulsourcecode.com/oauthcallback als return_uri eintragen.

Dein Beispiel braucht den Server, weil der die Dienstleistung anbieten will. Wenn aber die Dienstleistung von einer App auf dem Smartphone kommt, bräuchte ja die das Token und da könnte es etwas umständlich sein einen Server aufmachen zu müssen, falls das überhaupt so geht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:32 Uhr.
Seite 1 von 2  1 2      

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