Microsoft Graphのサンプルコードが動かないから直してみた
2023-06-29
azblob://2023/06/23/eyecatch/2023-06-23-graphapi-auth-odataerror-000.jpg

はじめに

こんにちは。秋山です。今回ハッカソン研修でMicrosoft365機能拡充チームとして開発を行っていました。その中でGraphAPIを使った開発で躓いたところとその解決方法を書いていこうと思います。同じエラーで困っている方向けの記事になります。

コードが更新されてない問題

今回の開発中に公式のサンプルコードを試しに動かしていた時です。

サンプルコードのドキュメントはこちら「Microsoft Graph で変更通知と変更追跡を使用する」

GraphAPIのSDKを使用しているときに事件は起きました。

手順通りコードを記述していると二か所のエラーが発生しました。

Request()

サンプルコード1

43行目のRequest()の箇所でエラーが出ています。内容は拡張メソッド「Request」は存在しませんというものです。

むむむ。調べてみるとこちらのRequest()を実際に使用しているコードが紹介されているサイトがちらほら出てきます。

困ったときは公式ドキュメント。こちらはGraphAPIのサブスクリプションを作成するサンプルなので、その公式ドキュメントを探します。「サブスクリプションを作成する

するとクエリの部分のコードが下記の様式になっています。

C#var result = await graphClient.Subscriptions.PostAsync(requestBody);

変数名は別としてクエリ部分もだいぶ違いますね。。。Request()は古い様式なのかもしれないです。

DelegateAuthenticationProvider クラス

さて、次のエラーです。

エラー2

81行目でエラーが出ていますね。内容はDelegateAuthenticationProviderが見つからないというものです。usingの記述漏れなどで生じるエラーかと思いますが。。。調べてみると英語ドキュメントしかありませんがMicrosoft.Graphパッケージに含まれるクラスと記述があります。おかしいですね。。。

手詰まりなので別角度から調べます。そもそもこれらのメソッドの目的がGraphAPIのクライアント作成と認証なのでそちらの方向から調べてみます。

参考ドキュメント

今回はクライアントシークレットにて認証を実装します。

Azure.Identityのパッケージをインストールしておく必要があります。

コードは下記のようになります。

C#var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "テナントID";
var clientId = "アプリID";
var clientSecret = "クライアントシークレット";
var options = new TokenCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
var clientSecretCredential = new ClientSecretCredential(
    tenantId, clientId, clientSecret, options);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

問題なくクライアント認証を行うことができました。

最後まで読んでいただきありがとうございました。