Hoe Ik Microsoft Graph integreerde in Mijn Delphi-toepassing

Microsoft Graph biedt een krachtige API om toegang te krijgen tot Microsoft 365-services, waaronder Outlook, OneDrive, Teams en meer. In mijn Delphi-toepassing wilde ik agenda-afspraken uit Outlook 365 synchroniseren met een interne database. Dit artikel beschrijft de stappen die ik heb genomen om deze integratie te realiseren.

Stap 1: Registratie van de Applicatie in Azure

Voordat je Microsoft Graph kunt gebruiken, moet je een applicatie registreren in het Azure-portaal:

  1. Ga naar Azure Portal en log in.

  2. Navigeer naar Azure Active Directory > App-registraties.

  3. Klik op Nieuwe registratie en vul de volgende gegevens in:

    • Naam: Mijn Delphi App

    • Ondersteunde accounttypen: Accounts in een organisatie (Single-tenant)

    • Omleidings-URI: http://localhost

  4. Klik op Registreren.

  5. Noteer de Application (client) ID en de Directory (tenant) ID.

  6. Onder API-machtigingen, voeg de benodigde machtigingen toe, zoals Calendars.Read en Calendars.ReadWrite.

  7. Onder Verificatie, voeg client credentials toe als je een daemon/service-toepassing bouwt, of gebruik OAuth2 PKCE voor interactieve authenticatie.

Stap 2: Authenticatie met Microsoft Graph

Microsoft Graph ondersteunt OAuth 2.0 voor authenticatie. In Delphi gebruik ik DMVCFramework REST Client in combinatie met TNetHTTPClient.
Een voorbeeld van hoe je een token ophaalt:

function GetAccessToken: string;
var
Http: TNetHTTPClient;
Params: TStringList;
Response: TStringStream;
begin
Http := TNetHTTPClient.Create(nil);
Params := TStringList.Create;
Response := TStringStream.Create;
try
Params.Add(‘grant_type=client_credentials’);
Params.Add(‘client_id=JOUW_CLIENT_ID’);
Params.Add(‘client_secret=JOUW_CLIENT_SECRET’);
Params.Add(‘scope=https://graph.microsoft.com/.default’);
Params.Add(’tenant=JOUW_TENANT_ID’);

Http.Post(‘https://login.microsoftonline.com/’ + JOUW_TENANT_ID + ‘/oauth2/v2.0/token’, Params, Response);

// Parse het JSON-resultaat om het access token op te halen
Result := ParseAccessToken(Response.DataString);
finally
Http.Free;
Params.Free;
Response.Free;
end;
end;

Stap 3: Ophalen van Outlook Agenda-Items

Zodra je een access token hebt, kun je een HTTP-aanroep maken naar Microsoft Graph om agenda-items op te halen.

function GetCalendarEvents(const AccessToken: string): string;
var
Http: TNetHTTPClient;
Response: TStringStream;
begin
Http := TNetHTTPClient.Create(nil);
Response := TStringStream.Create;
try
Http.CustomHeaders[‘Authorization’] := ‘Bearer ‘ + AccessToken;
Http.Get(‘https://graph.microsoft.com/v1.0/me/calendar/events’, Response);
Result := Response.DataString;
finally
Http.Free;
Response.Free;
end;
end;

Dit zal een JSON-respons retourneren met alle afspraken van de gebruiker.

Stap 4: Omzetten van JSON naar Delphi Objecten

Om de JSON-respons netjes te verwerken, gebruik ik Pkg.Json.DTO om de data te mappen naar een Delphi-object.

Eerst definieer je een DTO-object:

TEventDTO = class
public
Id: string;
Subject: string;
Start: TDateTime;
[JSONName(‘end’)]
EndTime: TDateTime;
end;

Dan parse je de JSON:

var
Events: TObjectList<TEventDTO>;
begin
Events := TJsonDTO.Deserialize<TObjectList<TEventDTO>>(GetCalendarEvents(AccessToken));
end;

Stap 5: Synchroniseren met de Lokale Database

Nadat de afspraken zijn opgehaald en gemapt naar objecten, kunnen ze worden opgeslagen in de Firebird-database. Dit kan met IBDAC:

procedure SaveEventToDatabase(Event: TEventDTO);
var
Query: TFDQuery;
begin
Query := TFDQuery.Create(nil);
try
Query.Connection := MyConnection;
Query.SQL.Text := ‘INSERT INTO Events (Id, Subject, StartTime, EndTime) VALUES (:Id, :Subject, :StartTime, :EndTime)’;
Query.ParamByName(‘Id’).AsString := Event.Id;
Query.ParamByName(‘Subject’).AsString := Event.Subject;
Query.ParamByName(‘StartTime’).AsDateTime := Event.Start;
Query.ParamByName(‘EndTime’).AsDateTime := Event.EndTime;
Query.ExecSQL;
finally
Query.Free;
end;
end;

Conclusie

Met deze aanpak heb ik Microsoft Graph succesvol geïntegreerd in mijn Delphi-toepassing om Outlook 365 agenda-items op te halen en te synchroniseren met een Firebird-database. Dit opent de deur naar verdere uitbreidingen, zoals bidirectionele synchronisatie of notificaties bij wijzigingen.

Hopelijk helpt dit artikel anderen die dezelfde integratie willen realiseren!

Geef een reactie

Je e-mailadres zal niet getoond worden. Vereiste velden zijn gemarkeerd met *

Scroll naar boven