Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   OAuth2 mit Indy (https://www.delphipraxis.net/197652-oauth2-mit-indy.html)

chkaufmann 24. Aug 2018 11:09

OAuth2 mit Indy
 
Hallo zusammen,

ich habe schon verschiedenes mit Indy HTTP Client gemacht, kenne die Komponenten somit recht gut.

Jetzt sollte ich Authentifizierung mit OAuth2 unterstützen und stehe etwas am Berg.
https://leverade.docs.stoplight.io

Was ich aus der Delphi App noch hinkriege ist den Browser starten für das Login. Aber wie bekomme ich dann das Request Token zurück in meine Applikation? Geht das überhaupt oder müssten die da ein anderes Interface anbieten?

Ich wäre froh um ein paar Tipps

Christian

Daniel 24. Aug 2018 11:26

AW: OAuth2 mit Indy
 
Moin,

wenn Du eine Delphi-Version >= XE5 hast, dann hast Du für OAuth2 eine Komponente im Rahmen der REST-Library.
Und auch wenn Du die nicht nutzen magst zugunsten einer eigenen Lösung, kannst Du Dort sehen, wie der Token abgegriffen wird. Letztlich geht das mit einem der Browser-Events ("OnAfterNavigate" / "OnTüdelütComplete" oder so ähnlich) und dort wird der vom Server zurückgegebene Inhalt abgegriffen und auf den Token hin untersucht.

chkaufmann 26. Aug 2018 19:08

AW: OAuth2 mit Indy
 
Danke für die Antwort.

Ich war mir gar nicht bewusst, dass diese REST Library auch bei der Professional Version dabei ist. Ich habe das Login jetzt so einigermassen hingekriegt. Allerdings tut das mit TWebBrowser nicht so 100%. Ich brauche dort das OnBeforeNavigate2 Event und wenn meine Callback URL mit ?code=... drin ist schliesse ich das Fenster und nehme von der URL das Token.

Aber so wie es scheint ist da ein "Internet Explorer" und der Login Dialog (Javascript davon) tut nicht ganz korrekt. Und ich fürchte bei meinen Kunden wird das je nach Windows und Service Packs unterschiedlich sein.

Gibt es eine gute Lösung für das Browser Fenster welches nicht von Internet Explorer abhängt? Chromium?

Christian

Bbommel 27. Aug 2018 07:29

AW: OAuth2 mit Indy
 
Ich habe es bei einer OAuth2-Implementation so gemacht, dass die Callback-URL auf "localhost" und irgendeinen freien Port geht. In meinem Programm wird dann für den Login-Vorgang ganz kurz ein eigener Webserver gestartet (TIdHTTPServer), der lokal auf dem angegeben Port lauscht und somit die Callback-URL auswerten und den Code daraus extrahieren kann. Damit das funktioniert, muss der OAuth2-Dienst, den du benutzt, solche Callbacks auf eine lokale URL natürlich zulassen.

Der kleine Nachteil ist, dass sich bei der erstmaligen Benutzung die Windows-Firewall meldet, weil dein Programm ja einen neuen Port zum Lauschen aufmacht - das muss man dann einmalig bestätigen.

Der große Vorteil ist, dass du für den eigentlichen Login über den Browser einfach jeden installierten Browser benutzen kannst, idealerweise den Standardbrowser. Vor allem, wenn der Benutzer über den OAuth2-Dienst bereits eingeloggt ist, dann muss er das ggf. nicht noch einmal tun, wenn du seinen Standardbrowser benutzt und nicht mit dem TWebbrowser arbeitest.

Vielleicht hilft dir das ja als Ansatz auch noch weiter.

Blackpit 27. Sep 2019 18:45

AW: OAuth2 mit Indy
 
Zitat:

Zitat von chkaufmann (Beitrag 1411546)
... Aber wie bekomme ich dann das Request Token zurück in meine Applikation? Geht das überhaupt oder müssten die da ein anderes Interface anbieten?

Ich wäre froh um ein paar Tipps

Christian

Mit den RestKomponenten in Seattle z.b. so:
Delphi-Quellcode:
    if RESTRequest.Response.GetSimpleValue('access_token', LToken) then
      OAuth2Authenticator.AccessToken := LToken;
Die richtigen Komponenteneinstellungen vorausgesetzt:wink:
HTH


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.

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