Microsoft Graph Explorerで/me/messagesが403 Forbiddenになる原因とMail.Readの同意・管理者同意で解決する方法

Microsoft Graph Explorerで /me/messages を実行すると403 Forbiddenになるのに、/me などは成功する――この差は「メール用の権限」と「同意(管理者同意)」にあります。本記事では原因の切り分けから、最短で直す手順、管理者に依頼する方法までをまとめます。

目次

現象:Microsoft Graph Explorerで /me/messages が 403 Forbidden になる

Graph Explorer(https://developer.microsoft.com/graph/graph-explorer)で次のようなリクエストを実行した際、レスポンスが 403 Forbidden となり、権限不足を示すメッセージが返ることがあります。

GET https://graph.microsoft.com/v1.0/me/messages

Graph Explorer上では、次のような文言(または同等の内容)が表示されます。

Forbidden - 403
Either the signed-in user does not have sufficient privileges, or you need to consent to one of the permissions on the Modify permissions tab

実際のレスポンスはJSONで、概ね次のようなエラー構造になっています(値は例)。

{
  "error": {
    "code": "ErrorAccessDenied",
    "message": "Access is denied. Check credentials and try again.",
    "innerError": {
      "date": "2025-01-01T00:00:00",
      "request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "client-request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
  }
}

同じサインイン状態のまま GET /me など一部のAPIは成功することが多いため、「このエンドポイントだけ失敗する原因が分からない」状態に陥りがちです。

結論:/me/messages はメール権限(Mail.Read など)と同意が必須

/me/messages は「サインイン中ユーザーのメールボックス(Outlook/Exchange)」にアクセスするAPIです。メール本文や添付ファイル、送受信履歴は機密情報そのものなので、Microsoft Graphでは次の2つが揃っていないと呼び出せません。

  • 必要なMicrosoft Graph権限(例:Mail.Read / Mail.ReadWrite) がアクセストークンに含まれている
  • その権限に対して、テナントのポリシーに沿った 同意(ユーザー同意または管理者同意) が行われている

逆に言うと、Graph Explorer自体が悪いわけではなく、「トークンにメール権限が入っていない」または「入れようとしても同意できない」 ことが原因です。

最短で解決するための全体フロー

「いま手元で早く直したい」方向けに、まずはこの流れで進めるのが最短です。

手順やること目的詰まりやすいポイント
手順AGraph Explorerの Modify permissions で Mail.Read を追加し、同意を完了メール権限をトークンに載せるチェックしただけで同意していない
手順Bサインアウト→サインインでトークンを取り直して再実行古いトークンを更新する同意済みでもトークンが更新されない
手順C同意できない場合は管理者に 管理者同意 を依頼テナントポリシーの壁を超える「どのアプリに何を付けるか」が曖昧
手順DそれでもNGなら、トークンの scp、メールボックス有無、ゲストユーザー等を確認権限以外の原因を切り分けExchangeライセンス未付与、条件付きアクセスなど

なぜ /me などは動くのに /me/messages だけ失敗するのか

Graph APIは、エンドポイントごとに要求される権限が異なります。たとえば /me は多くの環境で最小権限の User.Read(サインインユーザーの基本プロフィール取得)で動きます。これは多くのテナントで「ユーザーが自分で同意できる」または「既に同意済み」になっていることが多い権限です。

一方、/me/messages はメールというセンシティブなデータを扱うため、明示的にメール系の権限を追加して同意しない限り、サーバー側でブロックされます。Graph Explorerで「他のAPIは通るのに、メールだけ403」という現象は、まさにこの権限モデルの差で説明できます。

/me/messages に必要な権限を整理する

まずは「何をしたいか」で必要な権限が変わります。代表的なパターンを表にまとめます(Graph Explorerは通常、委任された権限=Delegatedを使います)。

やりたいこと代表的なエンドポイント例必要になりやすい権限(Delegated)補足
自分のメールを一覧取得GET /me/messagesMail.Read(最小)読み取りだけなら Mail.Read を優先
自分のメールを更新・移動・削除PATCH /me/messages/{id} などMail.ReadWrite必要な操作がある場合のみ
送信するPOST /me/sendMailMail.Send送信専用。読み取りとは別権限
共有メールボックス/他人のメールを読むGET /users/{id}/messagesMail.Read.Shared など別途「共有」アクセスが前提。自分の /me ではない

今回の /me/messages であれば、まずは Mail.Read が付いているかどうかを疑うのが最短です。

Microsoft Graphの権限タイプ:Delegated と Application

403の原因を正確に理解するには、権限の「種類」を把握しておくと一気に整理が進みます。Graph Explorerは基本的に Delegated(委任された権限) で、ユーザーとして操作する形です。

観点Delegated(委任された権限)Application(アプリケーション権限)
誰として動く?サインインユーザーアプリ(バックグラウンド)
トークン内の権限の見え方scp クレームにスコープが入るroles クレームにロールが入る
よくある用途ユーザー操作の自動化、画面付きアプリ夜間バッチ、監査、テナント全体処理
権限付与のハードルユーザー同意で済むケースもある(テナント設定次第)基本的に管理者同意が必要

Graph Explorerで試しているのに「Application権限のつもりで設計していた」などのズレがあると、必要な権限の考え方が噛み合わずに迷子になります。まずは Graph ExplorerはDelegated という前提で考えると切り分けが速いです。

最短で直す:Graph Explorerで Mail.Read を追加して同意する

最初に試すべき手順は、Graph Explorer側で権限を追加し、同意を完了させることです。テナントの設定によってはユーザー自身で同意できる場合もあります。

  1. Microsoft Graph Explorerにサインインする
  2. 右側(または上部)にある Modify permissions(権限の変更)を開く
  3. 検索ボックスで Mail.Read を探してチェックを入れる
  4. Consent(同意)または同意に相当するボタンを押して、表示される同意画面を完了する
  5. 再度 GET /me/messages を実行する

ここで重要なのは「チェックしただけ」ではダメで、同意(Consent)が完了しているかです。Graph Explorerの権限一覧には、Consented / Admin consented のような状態表示が出ることがあります。実行前に必ず確認してください。

また、同意を済ませたはずなのに変化がない場合は、次も試すと改善することがあります。

  • Graph Explorerから一度サインアウトして、サインインし直す(トークンを取り直す)
  • ブラウザの別プロファイルやシークレットウィンドウで再試行する(キャッシュの影響を切る)
  • 同じアカウントでMicrosoft 365(Outlook on the web)にログインできるか確認する(メールボックスが存在するかの確認)

管理者ができること:管理者同意が必要な環境での解決手順

組織によっては「ユーザー自身がアプリに同意できない」ようにポリシーで縛っているケースがあります。この場合、ユーザーがGraph Explorerで Mail.Read にチェックを入れても、同意が完了せず403のままになります。ここからは管理者側の対応です。

管理者がGraph Explorerで「組織として同意」する

管理者権限を持つアカウントでGraph Explorerにサインインできるなら、Graph Explorer上の同意画面で「組織として同意(on behalf of your organization)」にチェックを入れて承認する方法が最短です。画面の文言は環境や更新で多少変わりますが、狙いは テナント全体でMail.Readを許可する ことです。

Microsoft Entra 管理センターで同意状況を確認・付与する

Graph ExplorerはMicrosoftが提供するマルチテナントアプリとして動作します。管理センター側では、一般的に次のどちらか(または両方)で確認します。

  • Enterprise applications(エンタープライズ アプリケーション):テナントに存在するサービスプリンシパル(外部アプリ含む)の管理
  • App registrations(アプリの登録):自分で登録したアプリの管理(自作アプリの権限付与で主に利用)

Graph Explorerの権限付与を目的にするなら、まずは Enterprise applications 側で「Graph Explorer(またはMicrosoft Graph Explorer)」を検索し、権限(Permissions)の画面で Grant admin consent を実行する流れが分かりやすいです。自作アプリの場合は、App registrationsで対象アプリを開き、API permissionsから必要な権限を追加して管理者同意を与えます。

管理者向けの作業を、実務で迷いにくい形に落とすと次の流れです。

  1. Microsoft Entra 管理センターに管理者でサインインする
  2. Graph Explorerで使っているアプリ(Graph Explorer自体、または自作アプリ)を特定する
  3. API permissions(アクセス許可)で Mail.Read(必要に応じて Mail.ReadWrite 等)を追加する
  4. Grant admin consent を実行して、権限に「管理者同意済み」の状態を付ける
  5. 対象ユーザーがGraph Explorerで再サインインし、再度 GET /me/messages を実行する

「同意は付けたはずなのにユーザー側でまだ403」という場合は、ユーザーが古いトークンを持っていることが多いので、必ずサインアウト→サインイン をセットで案内すると解決が早いです。

管理者ではない場合:依頼するときに伝えるべきポイント

管理者同意が必要な環境では、ユーザー単独では解決できません。依頼するときは「何のアプリに、どの権限を、何の目的で」付けたいのかが揃っていると、管理者側の判断と作業が一気に速くなります。

管理者に伝える項目具体例理由
対象アプリMicrosoft Graph Explorer(または自作アプリ名)どのサービスプリンシパルに同意を付けるかを特定するため
使いたいAPIGET /me/messages必要権限の妥当性確認のため
必要な権限Mail.Read(読み取りのみ)最小権限で許可できるようにするため
利用目的メール一覧を取得して件名・受信日時を確認したい監査・セキュリティ上の承認判断の材料になる

そのまま送れる依頼文テンプレートも置いておきます。環境に合わせてアプリ名や目的だけ差し替えてください。

件名:Microsoft Graph Explorerでメール取得API(/me/messages)を利用するための管理者同意のお願い

管理者各位

Microsoft Graph Explorer で以下のMicrosoft Graph APIをテストしたいのですが、403 Forbidden となり実行できません。
テナントの同意ポリシーによりユーザー同意ができない可能性があるため、管理者同意の付与をお願いできますでしょうか。

■対象アプリ:
Microsoft Graph Explorer(Graph Explorer)

■利用したいAPI:
GET https://graph.microsoft.com/v1.0/me/messages

■必要な権限(Delegated):
Mail.Read(読み取りのみ)

■目的:
自分のメールボックスのメッセージ一覧(件名・送受信日時など)を取得して動作確認したい

以上、よろしくお願いいたします。

それでも403が出る場合の追加チェック

Mail.Read を付けて同意したのに403が続く場合、原因は「権限」以外にあることがあります。現場で遭遇しやすい順に、切り分けポイントを表にしました。

よくある原因確認ポイント対処の方向性
トークンにMail.Readが入っていないGraph Explorerでアクセストークンを表示し、scp に Mail.Read があるか権限のチェックだけでなく、同意完了→再サインインでトークン更新
ユーザー同意が禁止(同意ポリシー)同意画面が出ない/同意できない、または「管理者に連絡」と出る管理者同意(Enterprise applications / App registrations)で許可
アカウントにメールボックスがないOutlook on the webにサインインできない、Exchange Onlineライセンス未付与などライセンス付与、メールボックス作成(反映まで時間差が出る場合あり)
ゲストユーザー(B2B)でサインインしているユーザー種別がGuestで、テナント内にメールボックスが存在しないメールボックスを持つメンバーアカウントで実行する
条件付きアクセスやセキュリティ設定でブロック特定アプリの利用制限、準拠デバイス必須などの条件があるGraph Explorerが条件を満たすよう例外・ポリシー調整(管理者対応)

特に見落としやすいのが「チェックは付けたが同意していない」「同意したがトークンが古い」パターンです。Graph Explorerは操作が簡単な反面、権限とトークンの状態が追いにくいので、次のセクションの方法で トークンの中身を見て確認 すると迷いが減ります。

アクセストークンで確認する:scp(スコープ)を読む

Graph Explorerでは、実行に使っているアクセストークン(JWT)を表示できます。そこに含まれる権限を確認すると、「権限を付けたつもり」問題を即座に潰せます。

  • Delegated権限の場合:JWTの scp クレームにスコープがスペース区切りで入る
  • Application権限の場合:JWTの roles クレームにロールが入る

Delegatedで /me/messages を叩くなら、概ね次のように scp に Mail.Read が含まれている状態が目安です(例示のため一部省略しています)。

{
  "aud": "https://graph.microsoft.com",
  "iss": "https://login.microsoftonline.com/{tenant-id}/v2.0",
  "scp": "User.Read Mail.Read",
  "upn": "[email protected]"
}

scp に Mail.Read が無いのに /me/messages を実行すると、Graph側は正しく拒否します。403を見たら、まずは 「本当にスコープが入っているか」 を機械的に確認するのが最速です。

Graph Explorerでの実務的なコツ

Graph Explorerは学習・検証に非常に便利ですが、組織環境だと権限まわりで詰まりやすいのも事実です。実務でハマりにくくするコツをまとめます。

  • 最小権限から試す:まずは Mail.Read。できる限り Mail.ReadWrite をいきなり付けない
  • 目的の粒度を落とす:最初は GET /me/messages?$top=5 など少量で動作確認する
  • フィルターを使って負荷を下げる:$select=subject,receivedDateTime,from などで必要項目だけ取得する
  • 失敗時はエラーコードを見る:Graph Explorerの表示だけでなく、返ってきたJSONの error.code を確認する
  • 問い合わせ用の情報を控える:request-id と client-request-id は管理者・サポートへの連携で役立つ

たとえば、最初の確認用リクエストは次のように「小さく・軽く」すると、結果が見やすく、管理者への説明もしやすくなります。

GET https://graph.microsoft.com/v1.0/me/messages?$top=5&$select=subject,receivedDateTime,from

よくある質問

Mail.Readを付けると、管理者は私のメールを読めるようになりますか?

Delegated権限の Mail.Read は「サインインユーザーとして読む」ための権限です。管理者が付与したからといって、管理者が自動的にあなたのメールを読めるわけではありません。ただし、組織の運用や監査の仕組み(別の権限や機能)でアクセス可能なケースはあり得るため、組織ポリシーに従って利用してください。

Graph ExplorerでMail.Readにチェックを入れたのに、同意ボタンが押せません

多くの場合、テナントでユーザー同意が制限されています。この場合は管理者に「Graph Explorer(または対象アプリ)へMail.Readの管理者同意を付与」してもらう必要があります。本記事の依頼テンプレートを使うとスムーズです。

/me/messages ではなく /users/{id}/messages を叩きたいです

委任された権限で他人のメールボックスにアクセスするには、通常「共有メールボックスとしてのアクセス許可」と、Graph側の共有メール権限(例:Mail.Read.Shared)が必要です。単に Mail.Read を付けただけでは、他ユーザーのメールを読めません。

403ではなく404になることがあります

URLやAPIバージョン、パスの誤り、またはメールボックスが存在しないなど、状況により404が返ることがあります。まずは GET /me が成功すること、次に Mail.Read を同意できていることを順番に確認すると切り分けが安定します。

本番アプリではどう設計すれば安全ですか?

本番では、最小権限の原則に従い、必要最小限のスコープだけを要求し、同意画面に表示される説明文(アプリ名・目的)を明確にしておくのが重要です。また、403が返った場合に「管理者同意が必要かもしれない」ことをユーザーに案内できるよう、エラー処理と運用手順をセットで用意しておくと、問い合わせ対応のコストが大きく下がります。

まとめ:/me/messages の403は「Mail.Readの付与と同意」でほぼ解決できる

  • /me/messages はメールボックスへアクセスするため、Mail.Read などメール系権限が必須
  • Graph Explorerでは Modify permissionsで権限を追加し、同意まで完了させる
  • テナント設定でユーザー同意が禁止されている場合は、管理者同意 が必要
  • 権限を付けたのに403なら、トークンのscp確認、メールボックス有無、ゲストユーザー、条件付きアクセスも疑う

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次