+ 作るログイン
図を読み込んでいます…
1 / 7
MCP入門 ― AIに道具を持たせる共通の作法 / 全6章

認可 ― 401が道案内をし、利用者が同意する

発行
アニメモ公式
版
第1版
改訂
コマ
全7

遠くに置くMCPサーバーを守る仕組み。OAuth 2.1のどこにMCPサーバーが立つのか、401から認可サーバーへ辿り着くまでの3段階、そして最大の落とし穴「トークンの素通し」まで。

認可は任意。ただし、要る場面ははっきりしている

MCPの認可は必須ではありません。誰が呼んでも同じ答えを返す公開データだけを扱うなら、何も要りません。

要るのは、こういうときです。

- 利用者ごとに違うデータを扱う(メール、書類、社内DB)
- 誰が何をしたかを記録として残したい
- 利用者の同意が前提のAPIを、その人の代わりに叩く
- 社内のアクセス制御の下に置きたい
- 利用者ごとに回数制限をかけたい

そして手元で動く stdio のサーバーには、OAuth は使いません。すでに利用者の環境で、利用者の権限で動いているからです。資格情報は環境変数などローカルの手段で渡します。

つまりこの章は、遠くに置く Streamable HTTP のサーバーの話です。認可のチュートリアル

  • 05 / MCP GUIDE
  • 1 / 7
  • 認可は任意。ただし、要る場面ははっきりしている
  • MCPクライアント
  • ① 呼ぶ
  • MCPサーバー
  • AIアプリの中の部品
  • 受け取って検証する側
  • 利用者ごとのデータを扱うなら要る。手元の stdio には要らない。

MCPサーバーは「守られる側」であって、発行する側ではない

OAuth の登場人物で言うと、MCPサーバーは Resource Server(保護リソース) です。トークンを受け取って検証する側であり、トークンを発行する側ではありません。

発行するのは認可サーバーです。これは別の場所にあります。自社の認証基盤でもよいし、既製品でも構いません。

この分担が効いています。MCPサーバーを作る人は、ログイン画面も、パスワードの保管も、多要素認証も作らなくてよい。既にある認可サーバーの前に、自分のサーバーを置くだけです。

MCPは特定の認証方式を決めていません。OAuth 2.1 の作法に沿うと言っているだけです。だから既存の仕組みに乗せられます。

  • 05 / MCP GUIDE
  • 2 / 7
  • MCPサーバーは「守られる側」
  • MCPクライアント
  • ① 呼ぶ
  • MCPサーバー
  • AIアプリの中の部品
  • 受け取って検証する側
  • 発行するのは認可サーバー。ログイン画面もパスワードの保管も作らなくてよい
  • トークンを受け取って検証する。発行はしない。

401 が、道案内をする

未認証のクライアントが来たとき、サーバーは黙って断りません。どこへ行けばよいかを教えます。

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="mcp",
  resource_metadata="https://your-server.com/.well-known/oauth-protected-resource"

resource_metadata が道案内です。ここに「このサーバーについての説明書」の場所が書いてあります。

この形が素晴らしいのは、クライアントが事前に何も知らなくてよいことです。URLさえ知っていれば、1回叩いて401をもらい、そこから芋づる式に必要な情報へ辿り着けます。設定ファイルに認可サーバーのURLを書いてもらう必要がありません。

  • 05 / MCP GUIDE
  • 3 / 7
  • 401 が、道案内をする
  • MCPクライアント
  • ① 呼ぶ
  • MCPサーバー
  • AIアプリの中の部品
  • 受け取って検証する側
  • ② 401 で道案内
  • 黙って断らない。どこへ行けばよいかを返す。

説明書を読むと、認可サーバーの場所が分かる

道案内の先にあるのが、保護リソースメタデータです。RFC 9728 で形が決まっています。

json
{
  "resource": "https://your-server.com/mcp",
  "authorization_servers": ["https://auth.your-server.com"],
  "scopes_supported": ["mcp:tools", "mcp:resources"]
}

クライアントはここから認可サーバーを知り、今度は認可サーバー側のメタデータ(OpenID Connect Discovery か OAuth 2.0 Authorization Server Metadata)を読んで、/authorize と /token の場所を知ります。

つまり3段階のたらい回しです。401 → 保護リソースの説明書 → 認可サーバーの説明書。面倒に見えますが、おかげでクライアントは1つのURLだけ知っていればよくなっています。

なお、scopes_supported に何でも並べるのはやめましょう。広すぎるトークンは、漏れたときの被害がそのまま広くなります。

  • 05 / MCP GUIDE
  • 4 / 7
  • 説明書を読むと、認可サーバーの場所が分かる
  • MCPクライアント
  • ① 呼ぶ
  • MCPサーバー
  • AIアプリの中の部品
  • 受け取って検証する側
  • ② 401 で道案内
  • /.well-known/oauth-protected-resource
  • RFC 9728 の保護リソースメタデータ。ここから芋づる式に辿れる。

利用者が同意して、はじめてトークンが出る

認可サーバーが分かったら、クライアントは自分を名乗る必要があります。方法は3つあります。

- 事前登録 — あらかじめ登録済みの client_id を持っている
- 動的クライアント登録(DCR) — その場で登録する。認可サーバーが対応していれば使える
- 手入力 — どちらも無理なら、利用者に登録情報を入れてもらう

そのうえで、ブラウザで /authorize を開き、利用者がログインして権限を許可します。ここは OAuth 2.1 の認可コードフロー + PKCE の作法どおりです。

戻ってきた認可コードをトークンに交換し、以降は Authorization: Bearer … を付けて MCP サーバーを呼びます。

順番を間違えないでください。トークンを出すのは認可サーバー、受け取って検証するのはMCPサーバーです。

  • 05 / MCP GUIDE
  • 5 / 7
  • 利用者が同意して、はじめてトークンが出る
  • 認可サーバー
  • トークンを発行する側
  • ③ 同意して受け取る
  • MCPクライアント
  • ① 呼ぶ
  • MCPサーバー
  • AIアプリの中の部品
  • 受け取って検証する側
  • ② 401 で道案内
  • /.well-known/oauth-protected-resource
  • 認可コードフロー + PKCE。作法は普通のOAuthと同じ。

自分宛でないトークンを、受け取ってはいけない

ここが一番の落とし穴です。仕様はこう書いています。

MCPサーバーは、自分に対して発行されたものではないトークンを受け取ってはならない(MUST NOT)。

なぜか。他のサービス向けに発行されたトークンをそのまま受け入れ、さらにそれを下流のAPIへ横流しすると、次が起きます。

- 検査の迂回。回数制限や検証が、トークンの宛先を前提にしているなら、それが効かなくなる
- 追跡できなくなる。下流のログには、実際に転送したMCPサーバーではない誰かが記録される
- 横展開。1つのサービスを落とせば、同じトークンで他のサービスにも入れてしまう

これを トークンの素通し(token passthrough) と呼びます。禁止事項です。

対策は、受け取ったトークンの audience(宛先) が自分であることを必ず検証することです。下流を呼ぶときは、自分が別に取得したトークンを使います。

  • 05 / MCP GUIDE
  • 6 / 7
  • 自分宛でないトークンを、受け取ってはいけない
  • 認可サーバー
  • トークンを発行する側
  • ③ 同意して受け取る
  • MCPクライアント
  • ① 呼ぶ
  • MCPサーバー
  • 下流のAPI
  • AIアプリの中の部品
  • 受け取って検証する側
  • 別のトークンで呼ぶ
  • ② 401 で道案内
  • /.well-known/oauth-protected-resource
  • 素通しは禁止
  • audience を必ず確かめる。下流へそのまま渡さない。

確認:手元の stdio サーバーにも、OAuth を付けるべき?

答えはいいえです。stdio のサーバーは利用者のパソコンで、利用者の権限で動いています。ブラウザを開いて同意を取る意味がありません。環境変数などで資格情報を渡すのが正しいやり方です。

この章のまとめです。

- 認可は任意。要るのは利用者ごとのデータを扱うとき
- MCPサーバーは Resource Server。トークンは受け取って検証する側
- 401 + `WWW-Authenticate` が道案内になる
- 保護リソースメタデータ(RFC 9728)から認可サーバーへ辿る
- 自分宛でないトークンを受け取らない(素通し禁止)
- stdio には OAuth を使わない

次の章では、認可だけでは防げない種類の危なさを見ます。

  • 05 / MCP GUIDE
  • 7 / 7
  • 確認:手元の stdio サーバーにも OAuth を付ける?
  • 認可サーバー
  • トークンを発行する側
  • ③ 同意して受け取る
  • MCPクライアント
  • ① 呼ぶ
  • MCPサーバー
  • 下流のAPI
  • AIアプリの中の部品
  • 受け取って検証する側
  • 別のトークンで呼ぶ
  • ② 401 で道案内
  • stdio は環境変数などで渡す
  • /.well-known/oauth-protected-resource
  • 素通しは禁止
  • 付けない。すでに利用者の権限で動いている。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]