バックグラウンドで実行されるプログラムで OneDrive (API) に対して処理をしたい (C#)

おのでら 0 評価のポイント
2024-05-25T02:49:25.33+00:00

バックグラウンドで動かすプログラムから OneDirve にファイルをアップロードしようとしているのですが OneDrive へのアクセスで詰まって3日ほどたってしまったのでこちらに質問させていただきます。

やりたいこと

  • 表題の通りバッチプログラム (コンソールアプリケーション) で自動実行して OneDrive にファイルをアップロードする
  • ユーザーによる操作は行わない
  • プログラムは自分以外アクセスすることはない環境です

エラーの内容

  • access_token の取得まではできているが access_token を使用して graph.microsoft.com/v1.0/drives 等にアクセスすると「BadRequest」「Unauthorized」「Forbidden」「NotFound」などが発生してアクセスできない
  • バッチプログラムなので grant_type は client_credentials を指定。ちなみに authorization_code でのアクセスは成功しています。

環境

  • 個人用 Microsoft アカウント。なので OneDrive も個人用です
  • .NET 8
  • C#
  • Visual Studio 2022

構築手順

アプリの登録

  1. https://portal.azure.com/ から「アプリの登録」ページにアクセス
  2. アプリの登録作成。リダイレクトURLは未設定。サポートされているアカウントの種類は「任意の組織ディレクトリ内のアカウント (任意の Microsoft Entra ID テナント - マルチテナント) と個人用の Microsoft アカウント (Skype、Xbox など)」
  3. クライアントID と テナント ID 取得
  4. 証明書とシークレットで新しいクライアントシークレットを作成。期限を2年にして値 (シークレットIDではない)を取得
  5. API のアクセス許可を開き「追加」から「Microsoft Graph」「アプリケーションの許可」を選択し「Files.ReadWrite.All」を追加。(一応 Read や Site なども追加してみた)

プログラム (トークン取得)

  1. HttpClient クラスを使用し以下を送信。
  2. URL : https://login.microsoftonline.com/common/oauth2/v2.0/token (一応 common をテナントID に置き換えたりもしてみた)
  3. client_id : 上で取得したクライアントID
  4. scope : https://graph.microsoft.com/.default
  5. client_secret : クライアントシークレットの値
  6. grant_type : client_credentials
  7. Method : POST
  8. ContentType : application/x-www-form-urlencoded
  9. コンテンツエンコード : UTF-8
  10. 結果として「token_type」「expires_in」「ext_expires_in」「access_token」のレスポンス取得。access_token を次に使う

プログラム (OneDrive アクセス)

  1. HttpClient クラスを使用し以下を送信。
  2. URL : https://graph.microsoft.com/v1.0/me/drive/root/children
  3. ヘッダーに : Authorization : Bearer {access_token} 追加
  4. Method : GET
  5. 結果 : BadRequrst

他にも https://graph.microsoft.com/v1.0/users/yyyyyy/drivehttps://graph.microsoft.com/v1.0/drives/xxxxxx/root/children なども試してみましたが、Unauthorized や Forbidden が返ってくるだけでそれ以上の情報を得ることができませんでした。

何か抜けているところがあればご教示いただければと思います。

.NET
.NET
.NET ソフトウェア フレームワークに基づく Microsoft テクノロジ。
46 件の質問
Azure
Azure
Microsoft が管理する世界のデータ センター ネットワークを介してアプリケーションとサービスを構築、配置、および管理するインフラストラクチャおよびクラウド コンピューティング プラットフォーム。
203 件の質問
C#
C#
C 言語ファミリをルーツとし、コンポーネント指向プログラミングのサポートを含む、オブジェクト指向およびタイプセーフのプログラミング言語。
12 件の質問
0 件のコメント コメントはありません
{count} 件の投票

1 件の回答

並べ替え方法: 最も役に立つ
  1. gekka 7,831 評価のポイント MVP
    2024-05-26T16:06:05.5833333+00:00

    HttpClientではなくMicrosoft GraphGraph SDKでよければ次のようなサンプルで

    サンプル