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時間か。保存してもムダだな。リフレッシュトークン取得方法を調べる必要がありそうだ。