HttpClientではなくMicrosoft GraphGraph SDKでよければ次のようなサンプルで
バックグラウンドで実行されるプログラムで OneDrive (API) に対して処理をしたい (C#)
おのでら
0
評価のポイント
バックグラウンドで動かすプログラムから 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
構築手順
アプリの登録
- https://portal.azure.com/ から「アプリの登録」ページにアクセス
- アプリの登録作成。リダイレクトURLは未設定。サポートされているアカウントの種類は「任意の組織ディレクトリ内のアカウント (任意の Microsoft Entra ID テナント - マルチテナント) と個人用の Microsoft アカウント (Skype、Xbox など)」
- クライアントID と テナント ID 取得
- 証明書とシークレットで新しいクライアントシークレットを作成。期限を2年にして値 (シークレットIDではない)を取得
- API のアクセス許可を開き「追加」から「Microsoft Graph」「アプリケーションの許可」を選択し「Files.ReadWrite.All」を追加。(一応 Read や Site なども追加してみた)
プログラム (トークン取得)
- HttpClient クラスを使用し以下を送信。
- URL : https://login.microsoftonline.com/common/oauth2/v2.0/token (一応 common をテナントID に置き換えたりもしてみた)
- client_id : 上で取得したクライアントID
- scope : https://graph.microsoft.com/.default
- client_secret : クライアントシークレットの値
- grant_type : client_credentials
- Method : POST
- ContentType : application/x-www-form-urlencoded
- コンテンツエンコード : UTF-8
- 結果として「token_type」「expires_in」「ext_expires_in」「access_token」のレスポンス取得。access_token を次に使う
プログラム (OneDrive アクセス)
- HttpClient クラスを使用し以下を送信。
- URL : https://graph.microsoft.com/v1.0/me/drive/root/children
- ヘッダーに : Authorization : Bearer {access_token} 追加
- Method : GET
- 結果 : BadRequrst
他にも https://graph.microsoft.com/v1.0/users/yyyyyy/drive や https://graph.microsoft.com/v1.0/drives/xxxxxx/root/children なども試してみましたが、Unauthorized や Forbidden が返ってくるだけでそれ以上の情報を得ることができませんでした。
何か抜けているところがあればご教示いただければと思います。