Accéder aux événements de calendrier d’un utilisateur à l’aide de Microsoft Graph

Effectué

Vous utilisez une application ASP.NET Core et vous l’avez connectée à Microsoft 365. Dans cette unité, vous allez découvrir comment afficher les événements de calendrier d’un utilisateur pour la semaine à venir. Vous découvrirez également comment interroger des événements de données pour une période donnée. Enfin, vous découvrirez des concepts tels que la sélection et l’ordre de tri d’affichage des informations de la manière souhaitée.

Choisir les autorisations dont votre application a besoin

Toutes les données exposées par Microsoft Graph sont sécurisées et votre application doit avoir les autorisations nécessaires pour y accéder. L’autorisation nécessaire dépend du type d’informations dont votre application a besoin pour l’accès. Par exemple, pour accéder au calendrier de l’utilisateur, votre application doit avoir l’autorisation Calendars.Read. La liste exacte des autorisations requises pour chaque opération est disponible dans la référence de l’API Microsoft Graph.

Si votre application charge différents types de données, les utilisateurs qui l’utilisent doivent lui accorder plusieurs autorisations d’accès à ces informations. Il est recommandé de demander dans votre application uniquement les autorisations dont vous avez besoin.

Spécifier les autorisations nécessaires

La liste des autorisations accordées à votre application se trouve dans le jeton d’accès. La norme OAuth les appelle « étendues ». Lorsque votre application utilise MSAL pour obtenir le jeton d’accès, elle doit inclure une liste d’étendues dans la requête à l’ID Microsoft Entra. Chaque opération dans Microsoft Graph possède sa propre liste d’étendues. Si votre jeton d’accès n’en a pas, la demande sera refusée.

L’exemple d’application stocke les autorisations requises dans le fichier appsettings.json dans une propriété Scopes comme vous l’avez vu précédemment.

"Scopes": "user.read presence.read mailboxsettings.read calendars.read"

La valeur de propriété Scopes est utilisée par l’intergiciel ASP.NET Core de l’application, qui gère la récupération d’un jeton d’accès une fois que l’utilisateur s’est correctement connecté.

Intergiciel : Plateforme d'identités Microsoft et Microsoft Graph

ASP.NET Core prend en charge les intergiciels qui peuvent être utilisés pour authentifier et autoriser les utilisateurs. Il peut également être utilisé pour récupérer un jeton qui peut être utilisé pour appeler Microsoft Graph, injecter un objet SDK Microsoft Graph nommé GraphServiceClient dans l’application, créer un cache de jetons, etc. L’intergiciel est configuré dans Startup.cs et gère les tâches suivantes.

  1. Récupérez les autorisations requises définies dans la propriété Scopes à partir de appsettings.json.
  2. Ajoutez la prise en charge de l’authentification OpenId.
  3. Spécifiez que l’application est une application web Plateforme d'identités Microsoft qui nécessite un flux de code d’authentification.
  4. Ajoutez la possibilité d’appeler des API Microsoft Graph avec des autorisations spécifiques.
  5. Activez l’injection de dépendances pour GraphServiceClient (objet fourni par le SDK Microsoft Graph utilisé pour effectuer des appels Microsoft Graph).
  6. Ajoutez un cache de jetons en mémoire.
  7. Exigez qu’un utilisateur authentifié accède à l’application.
  8. Activez la prise en charge de Razor Pages.
  9. Ajoutez des pages d’interface utilisateur Microsoft Identity qui fournissent la prise en charge de la connexion et de la déconnexion de l’utilisateur.

Vous pouvez voir chacune de ces étapes dans le code suivant défini dans la méthode ConfigureServices() de Startup.cs.

// 1. Retrieve required permissions from appsettings
string[] initialScopes =
Configuration.GetValue<string>("DownstreamApi:Scopes")?.Split(' ');


services
  // 2. Add support for OpenId authentication
  .AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)

  // 3. Microsoft identity platform web app that requires an auth code flow
  .AddMicrosoftIdentityWebApp(Configuration)

  // 4. Add ability to call Microsoft Graph APIs with specific permissions
  .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)

  // 5. Enable dependency injection for GraphServiceClient
  .AddMicrosoftGraph(Configuration.GetSection("DownstreamApi"))

  // 6. Add in-memory token cache
  .AddInMemoryTokenCaches();


// 7. Require an authenticated user
services.AddControllersWithViews(options =>
{
  var policy = new AuthorizationPolicyBuilder()
      .RequireAuthenticatedUser()
      .Build();
  options.Filters.Add(new AuthorizeFilter(policy));
});

services
  // 8. Add Razor Pages support
  .AddRazorPages()

  // 9. Add Microsoft Identity UI pages that provide user
  // sign-in and sign-out support
  .AddMicrosoftIdentityUI();

Une fois l’intergiciel requis configuré, l’application gère automatiquement la connexion de l’utilisateur et la récupération du jeton d’accès. Le jeton d’accès peut ensuite être utilisé pour récupérer les événements de calendrier d’un utilisateur, car il contiendra les autorisations requises. Examinons le fonctionnement de ce processus.

Récupérer les événements de calendrier d’un utilisateur pour une période donnée

Pour obtenir les événements de calendrier d’un utilisateur à partir de Microsoft Graph, vous devez appeler le point de terminaison /me/calendarview . Il renvoie la liste des événements de calendrier à partir du calendrier par défaut de l’utilisateur connecté. Vous pouvez effectuer l’appel à Microsoft Graph à l’aide de l’objetGraphServiceClient mentionné précédemment dans la section middleware. GraphServiceClient fournit des API qui peuvent être utilisées pour appeler des Microsoft Graph sans avoir à effectuer manuellement des appels HTTP. Pour afficher les événements de calendrier de la semaine à venir, vous devez définir les dates de début de semaine et de fin de semaine.

// Configure a calendar view for the current week
var startOfWeek = DateTime.Now;
var endOfWeek = startOfWeek.AddDays(7);

Ces dates sont ensuite ajoutées à une liste QueryOption qui définit la plage d’événements à sélectionner.

var viewOptions = new List<QueryOption>
{
  new QueryOption("startDateTime", startOfWeek.ToString("o")),
  new QueryOption("endDateTime", endOfWeek.ToString("o"))
};

Un objetGraphServiceClient(injecté dans le constructeur de la classe de modèle Razor Pages) est ensuite utilisé pour appeler Me.CalendarView et la liste viewOptions est passée dans la méthode Request pour limiter les résultats. Le code inclut également le fuseau horaire préféré de l’utilisateur en appelant la méthode Header.

// Use the injected GraphServiceClient object to call into Me.CalendarView
var calendarEvents = await _graphServiceClient
    .Me
    .CalendarView
    .Request(viewOptions)
    .Header("Prefer", $"outlook.timezone=\"{userTimeZone}\"")

La minimisation de la quantité de données récupérées et transférées par Microsoft Graph améliore considérablement les performances de votre application. La méthode GraphServiceClient’s Select peut être utilisée pour sélectionner des propriétés spécifiques que l’application utilise.

.Select(evt => new
{
    evt.Subject,
    evt.Organizer,
    evt.Start,
    evt.End
})

Enfin, la méthode OrderBy est utilisée pour spécifier comment trier les éléments résultants et GetAsync est appelée pour démarrer la demande.

.OrderBy("start/DateTime")
.GetAsync();

Dans ce cas, le code trie les résultats par sous-propriété de la propriété start nommée DateTime. Pour effectuer un tri en fonction de plusieurs champs, spécifiez une liste de champs séparés par des virgules. Vous pouvez également indiquer si vous souhaitez trier les éléments dans l’ordre croissant ou décroissant en ajoutant le mot clé asc ou desc à la requête. La version complète du code s’affiche ensuite :

// Configure a calendar view for the current week
var startOfWeek = DateTime.Now;
var endOfWeek = startOfWeek.AddDays(7);

var viewOptions = new List<QueryOption>
{
    new QueryOption("startDateTime", startOfWeek.ToString("o")),
    new QueryOption("endDateTime", endOfWeek.ToString("o"))
};

// Use the injected GraphServiceClient object to call into Me.CalendarView
var calendarEvents = await _graphServiceClient
    .Me
    .CalendarView
    .Request(viewOptions)
    .Header("Prefer", $"outlook.timezone=\"{userTimeZone}\"")
    .Select(evt => new
    {
        evt.Subject,
        evt.Organizer,
        evt.Start,
        evt.End
    })
    .OrderBy("start/DateTime")
    .GetAsync();

Examinons comment vous pouvez utiliser ce code dans l’application.