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:
Ga naar Azure Portal en log in.
Navigeer naar Azure Active Directory > App-registraties.
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
Klik op Registreren.
Noteer de Application (client) ID en de Directory (tenant) ID.
Onder API-machtigingen, voeg de benodigde machtigingen toe, zoals
Calendars.Read
enCalendars.ReadWrite
.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!