その OAuth 同意、ほんとに『全部かゼロか』でいいの?
みんな、しぃちゃんだよ!今日は Cloudflare のブログで、OAuth の同意画面について「なるほど」ってなる話を見つけたから紹介するね!
Cloudflare Blogなにが発表されたの?
Cloudflare の Engineering ブログに、OAuth の同意フローを「全部か・ゼロか」から「タスクベース」に変える取り組みが紹介されたよ。ちょうど同じタイミングで Cloudflare Changelog 側でも、この仕組みを実現する「Optional OAuth Scopes」機能の GA が発表されていて、このブログ記事はその狙いと背景を詳しく解説する内容になっているよ。
なぜ重要なの?
今までの OAuth は、アプリが要求したスコープをユーザーが「全部承認する」か「全部拒否する」かしか選べなかったの。記事では、AI エージェントが使う MCP サーバーを例に挙げていて、「MCP サーバーは、エージェントが理論上すべての権限を使う可能性があるから、幅広いアクセス許可セットをリクエストしがち。でも、ほとんどのユーザーはエージェントにそこまでのアクセス権を渡したくない」という状況が指摘されているよ。ユーザーが求めるアクセス量とアプリが要求するアクセス量にズレがあっても、今までは妥協点がなかったんだね。
これで何が変わるの?
開発者は OAuth クライアントを作るときに、スコープを scopes(必須)と optional_scopes(任意)に分けて登録できるようになったよ。原文にはこんな API 呼び出し例が載ってる。
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/oauth_clients" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"client_name": "ACME Corp",
"scopes": [
"user-details.read",
"workers-scripts.write",
"workers-kv-storage.write",
"zone.read"
],
"optional_scopes": [
"workers-kv-storage.write",
"zone.read"
]
}'
optional_scopes に入れたスコープだけが、ユーザーの同意画面で個別にオン・オフできる対象になるよ。ユーザーが任意スコープを外して認可を完了すると、発行されるアクセストークンには実際に同意されたスコープしか含まれない。つまりアプリ側は、「頼んだスコープが全部もらえる前提」ではなく、ユーザーが選んだ分だけを受け取る前提で設計する必要が出てくるんだね。
深く潜ってみよう
このタスクベースの同意は、「必須スコープはこれまで通りまとめて承認」「任意スコープだけユーザーが取捨選択」という形で、同意画面が複雑になりすぎないように設計されているのがポイントだよ。全部のスコープを個別チェックボックスにしちゃうと、ユーザーは結局よく考えずに全部チェックしちゃうことが多いから、「必須はそのまま・任意だけ選ばせる」くらいの粒度が、セキュリティと使いやすさのバランスが良いってことみたい。
具体的な同意画面の見た目については原文でもスクリーンショットで示されているんだけど、テキストとしての詳細な説明は少なめだったよ。気になる人は原文をチェックしてみてね。
まとめ
- Cloudflare が OAuth の同意フローを「全部か・ゼロか」から「タスクベース」に変える設計を解説
- MCP サーバーのように、AI エージェントが幅広い権限を要求しがちなケースが課題として挙げられている
- 開発者は
scopesとoptional_scopesを分けて登録し、ユーザーは任意スコープだけ個別に拒否できる - 発行されるアクセストークンには、実際に同意されたスコープのみが含まれる
AI エージェントや MCP サーバーを作っていて、権限まわりの設計に悩んでいるエンジニアさんに刺さる話だよ!