アクセストークンを指定して Microsoft Graph を呼び出す

Microsoft Graph を使って Microsoft Todo の CRUD ができることは確認したけど、アクセストークンは単独で取得しておきたい。そして、そのアクセストークンを GraphServiceClient で使いたい。

GitHubソースコードを見たところ、アクセストークンは、InteractiveBrowserCredential. GetTokenAsync で取得できそう。DelegateAuthenticationProvider を使えば、Microsoft Graphを呼び出すときのアクセストークンを指定できそうだった。

using System.Net.Http.Headers;
using Azure.Core;
using Azure.Identity;
using Microsoft.Graph;

// Microsoft Todo のタスクとリストを CRUD するには
// Tasks.ReadWrite の許可が必要。
var scopes = new[]
{
    "Tasks.ReadWrite",
};

// 一般ユーザーの Microsoft Todo にアクセスするときは
// common を指定すれば良いみたい。
var tenantId = "common";

// Azure AD で登録したアプリケーションの ID (Client ID)
var clientId = "YOUR_CLIENT_ID";

// Web ブラウザを表示して、
// ユーザーに Microsoft アカウントにログインするように設定。
var options = new InteractiveBrowserCredentialOptions
{
    TenantId = tenantId,
    ClientId = clientId,
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
    RedirectUri = new Uri("http://localhost"),
};
var interactiveCredential = new InteractiveBrowserCredential(options);

// アクセストークンを先に取得
var token = await interactiveCredential.GetTokenAsync(new TokenRequestContext(scopes));
Console.WriteLine($"ExpiresOn: {token.ExpiresOn}");

// DelegateAuthenticationProvider を使って、
// 取得しておいたアクセストークンを Authorization ヘッダーにセットして
// Microsoft Graph を呼び出せるようにする。
var authProvider = new DelegateAuthenticationProvider(request =>
{
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.Token);
    return Task.CompletedTask;
});
var graphClient = new GraphServiceClient(authProvider);

// リスト一覧表示
var todoLists = await graphClient.Me
    .Todo
    .Lists
    .Request()
    .GetAsync();
foreach (var todoList in todoLists)
{
    Console.WriteLine($"既存のリスト: {todoList.DisplayName}");
}

Console.ReadLine();

.NET 6 で実行。

アクセストークンを取得し、それを GraphServiceClient で使って、Microsoft Graph を呼び出せた。ただ、アクセストークンの有効期限は1時間か。保存してもムダだな。リフレッシュトークン取得方法を調べる必要がありそうだ。