Die Anmeldung an einen Exchange mit Modern Auth ist an sich trivial. Derzeit gibts du ein Username und Kennwort an. Bei Modern Auth ersetzt du das Kennwort durch ein Token. (Also weiterhin mit
POP3/
SMTP/IMAP)
Etwas komplexer ist der Weg zum Token:
- Du musst dein Programm bei MS registrieren. Dort hinterlegst du auch Information zum Hersteller, wie z.B. eine Webseite. Bei der Registrierung bekommt dein Programm eine Client-ID.
- Wenn ein Anwender ein entsprechendes Mail-Konto einrichten möchte, dann musst du eine Login Seite von MS öffnen. Am einfachsten z.B. in einer Webbrowser Komponente. Der Login Seite wird u.a. die Client-ID deines Programms übergeben.
- Auf der Seite kann sich der Anwender mit seinen Office 365 Daten anmelden. Dann wird er gefragt, ob er deinem Programm Zugriff gestatten möchte.
- Gewährt der Anwender Zugriff, wird auf eine Webseite weitergeleitet, welche du hinterlegen kannst. An diese wird das Token übergeben (ich vermute deshalb meinte mjustin, dass ein lokaler Webserver nötig sei). Zumindest bei MS und Google kann man angeben, dass das Token an ein (nicht Web) Programm übergeben werden soll. Dann braucht man keinen Webserver. Das Token kann man aus dem Titel der Webseite oder aus einem Parameter der Redirect
URL lesen. redirect_uri wären dann: "urn:ietf:wg
auth:2.0
ob" bzw. "https://login.microsoftonline.com/common/oauth2/nativeclient"
Das würde ich dir empfehlen:
- Sieh dir das REST bzw. OAUTH Beispielprojekt von Delphi an (ich meine da gibt es eines, in dem u.a. Delphi Praxis angesprochen wird). Und lerne OAUTH2 und dessen Ablauf zu verstehen.
- Wenn du OAUTH verstanden hast, siehe dir die Graph
API von MS an. Über diese erhältst du das Token.
Ich würde nicht direkt mit der Graph
API anfangen. Die ist doch recht komplex und mit den vielen, teilweise sehr ähnlichen Rechten, teils verwirrend.
Und wegen den Indys:
- Senden und Empfangen kein Problem
- Autorisierung und erstes Token abholen ist bestimmt, teilweise mit Indys machbar. Wäre mir aber viel zu umständlich (es muss eine Webseite angezeigt/gerendert werden). Hier würde ich eine Browserkomponente benutzen
- Mit dem Refreshtoken das Accesstoken aktualsieren funktioniert aber wieder einwandfrei mit
Indy
Das müsste das Projekt sein, welches ich meinte:
RESTDemo auf Github