![]() |
AW: Indy und OAuth / Microsoft365
Hilft dir das hier weiter?
unter anderem: Zitat:
|
AW: Indy und OAuth / Microsoft365
So Leute,
habe es hinbekommen (ChatGPT sei Dank). Es lag an der Tokenabfrage. Mit ChatGPT habe ich folgende Funktion zur Tokenabfrage für eine "App-Registrierung" erstellt:
Delphi-Quellcode:
Mit dem Token der damit zurück kommt, klappt der Mailversand mit dem Source oben im Thread.uses System.Net.HttpClient, System.Net.URLClient, System.SysUtils, System.JSON, System.Classes, System.NetEncoding; function TForm1.GetAccessToken: string; var HttpClient: THTTPClient; AccessTokenURL, ClientID, ClientSecret, Scope: string; Response: IHTTPResponse; begin // Set your application-specific values AccessTokenURL := 'https://login.microsoftonline.com/<YOUR-TENANT-ID>/oauth2/v2.0/token'; ClientID := '<ANWENDUNGS-ID>'; ClientSecret := '<YOUR-CLIENT-SECRET>'; Scope := 'https://outlook.office365.com/.default'; // Scope for Microsoft 365 API // Create and configure the HTTP client HttpClient := THTTPClient.Create; try // Prepare the request parameters HttpClient.ContentType := 'application/x-www-form-urlencoded'; HttpClient.Accept := 'application/json'; // Create the request body var RequestData := 'grant_type=client_credentials' + '&client_id=' + TNetEncoding.URL.Encode(ClientID) + '&client_secret=' + TNetEncoding.URL.Encode(ClientSecret) + '&scope=' + TNetEncoding.URL.Encode(Scope); // Send the POST request to obtain an access token Response := HttpClient.Post(AccessTokenURL, TStringStream.Create(RequestData)); // Check for a successful response if Response.StatusCode = 200 then begin // Parse the JSON response to extract the access token // You may use a JSON library or implement your own parsing logic // Example: Extract the access token assuming JSON response format // You should add appropriate error handling and validation var AccessToken := ExtractAccessToken(Response.ContentAsString); // Return the access token Result := AccessToken; end else begin // Handle the case where the request fails (e.g., non-200 status code) // You should implement error handling according to your requirements Result := ''; end; finally HttpClient.Free; end; end; // Implement a function to extract the access token from the JSON response function TForm1.ExtractAccessToken(const JsonResponse: string): string; var JsonValue: TJSONValue; begin // Parse the JSON response to extract the access token // You may use a JSON library or implement your own parsing logic // Example (assuming JSON response format): // Search for the "access_token" key and extract its value // You should add appropriate error handling and validation // For demonstration purposes, we'll use Delphi's built-in JSON parser. JsonValue := TJSONObject.ParseJSONValue(JsonResponse); try if (JsonValue is TJSONObject) then begin Result := (JsonValue as TJSONObject).GetValue('access_token').Value; end else begin // Handle the case where JSON parsing fails Result := ''; end; finally JsonValue.Free; end; end; Vielen Dank für Eure Hilfe. |
AW: Indy und OAuth / Microsoft365
Hallo,
obwohl der Thread schon älter ist habe ich dazu noch eine Frage, da das Thema bei uns jetzt auch aktuell geworden ist. 1. Wo kommen diese Daten her? AccessTokenURL := 'https://login.microsoftonline.com/<YOUR-TENANT-ID>/oauth2/v2.0/token'; ClientID := '<ANWENDUNGS-ID>'; ClientSecret := '<YOUR-CLIENT-SECRET>'; Scope := 'https://outlook.office365.com/.default'; // Scope for Microsoft 365 API 2. Wenn das Token verfügbar ist, dann soll das wie folgt verwendet werden: lcUserPass:=TIdUserPassProvider.Create(lcSMTP); lcUserPass.Username:='myname@test.onmicrosoft.com' ; lcUserPass.Password:=ptToken; Das Token hat doch aber mit dem Username nichts zu tun. Der wird doch in 1. nirgends übergeben. Trotzdem dient das als Paßword für den USER unter 2. Kann mir da einer weiterhelfen? Danke Stefan |
AW: Indy und OAuth / Microsoft365
Liste der Anhänge anzeigen (Anzahl: 2)
Hallöle...8-)
Aus Microsoft Entra (früher Azure) Admin Center. :wink: Anmelden, vorzugsweise Admin für Alle, App definieren und dann hast du die zugehörigen ID. :wink: Dann mußt du dich durchkämpfen. Besonders mit den Zugriffsrechten... PS: Wenn du die Zugangsdaten dem Programm mitgeben mußt...sicher verschlüsseln! Nicht im Klartext in die INI...:warn: |
AW: Indy und OAuth / Microsoft365
OK, danke.
Das beantwortet Teil 1 meiner Frage. Die Daten für das OAUTH dienen also dazu, mich generell gegenüber dem Webservice zu authentifizieren. Beim Senden über Indy gebe ich dann ja aber einen Username an und den OAUTH-Key. Dieser ist aber nicht userbezogen. Wie wird dann der Benutzer authentifiziert? |
AW: Indy und OAuth / Microsoft365
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ein Testprogramm von mir ohne ClientID (Stand 2022 mit 'code_challenge_method', 'S256')
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx mit dem eigenem ersetzen Mit dem AccessToken wird die E-mail Versendet Mit dem RefrehToken bekommt man den neuen AccessToken Achtung, da werden die Token als Klartext ausgegeben |
AW: Indy und OAuth / Microsoft365
Sehe ich das richtig, daß der ClientSecret nicht benötigt wird?
Und weiterhin meine Frage zu dem Thema, das ich immer noch nicht verstanden habe: Das Token ist meine Berechtigung, überhaupt Mails zu versenden. Bei Der Authentifizierung mittels INdy übergebe ich dann die Mail des Benutezrs und das Token. Das Toekn ist aber nicht userabhängig, also kann ich jeden beliebigen User (E-Mail-Postfach) angeben. Das kann doch nicht sein, oder? |
AW: Indy und OAuth / Microsoft365
ClientSecret wird bei Google verwendet, bei Microsoft nicht
|
AW: Indy und OAuth / Microsoft365
Zitat:
Der AccessToken kann auch mal 1000 Zeichen lang sein, da steht dann wohl alles mit drin was der Benutzer darf? |
AW: Indy und OAuth / Microsoft365
Setup der Einstellungen und Rechte hat uns zwei Monate gekostet.
Wenn passend eingerichtet könnte jeder Nutzer von jedem Account senden. Per default geht das aber nicht. Du musst ein Sender Account angeben für das eine Autorisierung von einem Admin gegeben wurde. Das passiert beim ersten Versuch ein OAuth durchzuführen. M$ merkt sich das. Dafür öffnet sich im Browser eine Website in der sich der Admin identifizieren muss. Wenn du "ClientCredentials" als Grand Type verwendest ist später nur das AccessToken relevant. Die Authorisierung via WebPage kommt damit nicht erneut und Du musst kein AuthRefreshToken speichern. Wir verwenden NSoftware für den Zugriff. Wie immer ein Genuss. |
| Alle Zeitangaben in WEZ +1. Es ist jetzt 20:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz