Auth0 for AI Agentsの「非同期認可」の機能で、AIの「勝手な行動」を防ぐ承認フローが組めるぞ

Auth0 for AI Agentsの「非同期認可」の機能で、AIの「勝手な行動」を防ぐ承認フローが組めるぞ

2025.12.21

はじめに

本記事は SaaSで加速するゲーム開発 - Advent Calendar 2025 - の 21 日目のブログです。

前回あらすじ

前回は、2025年11月にGAとなった Auth0 for AI Agents を使い、「AIが参照できるデータをユーザーの権限範囲に留める(Readの制御)」検証を行いました。

https://dev.classmethod.jp/articles/2025-11-ga-auth0-for-ai-agents/

しかし、AIエージェントで実行したいのは「データの参照」だけではありません。 APIを叩いて商品を注文したり、会議室を予約したり、送金をしたりと、AIに「アクション」を実行してもらいたい場面も多々あります。

ここで、「もしAIがハルシネーションを起こして、勝手に100個の商品を注文したら?」 「ユーザーの曖昧な指示を勘違いして、重要なデータを削除したら?」という課題が生じます。

今回は、そのようなAIの「やり過ぎ」を未然に防ぐための機能、Auth0 for AI agentのAsynchronous Authorization(非同期認可)について、アーキテクチャの観点から解説します。

検証シナリオ

ユーザーがチャットで「スニーカーを買って」と指示したとき、AIが即座に決済APIを叩くのではなく、一度ユーザーのスマホに通知を飛ばし、「以下の内容で注文して良いですか?」と承認を求めるフローを構築します。

この裏側では、CIBAというプロトコルが動いています。

CIBAとは?

CIBA(シーバ)の正式名称は Client-Initiated Backchannel Authentication です。

一言で言うと、「操作しているデバイス(PCなど)とは別のデバイス(スマホなど)で、本人確認や承認を行う仕組み」のことです。

CIBAは、AIのために作られた新しい技術ではありません。
OIDCの拡張仕様として策定され、金融業界やコールセンターなどで利用されてきた技術です。

例えば、コールセンターのオペレーターが、電話口の顧客(承認者)のスマホに「本人確認通知」を送る。
もしくは、画面のないスマートスピーカーが、持ち主のスマホ(承認者)に「決済承認」を送る。

このように「操作する主体」と「承認する主体/デバイス」が分離しているケースで使われてきました。

処理の全体像(シーケンス)

今回の検証で構築するフローをシーケンス図にしました。
AIが勝手にAPIを叩くのではなく、必ず人間の承認を経由しないとアクセストークンが発行されない流れになっています。

auth0-for-ai-agents-ai-ciba_2

実装のポイント

公式のチュートリアルに従って実装します。
このフローを実現するための核となるのが、Auth0 AI SDKが提供する bindingMessage です。

https://auth0.com/ai/docs/get-started/asynchronous-authorization

AIエージェント(今回はLangGraphを使用)のツール定義を withAsyncAuthorization でラップすることで、この承認フローを強制的に組み込めます。

// src/lib/auth0-ai.ts
export const withAsyncAuthorization = auth0AI.withAsyncAuthorization({
  // 承認を求める対象のユーザーID(現在会話しているユーザー)
  userID: async (_params, config) => {
    return config.configurable?.langgraph_auth_user?.sub;
  },

  // スマホの通知画面に表示するメッセージ
  // AIがツールに渡そうとしている引数(product, qty)に埋め込める
  bindingMessage: async ({ product, qty }) =>
    `Do you want to buy ${qty} ${product}?`,

  // 必要なスコープ(API実行用)
  scopes: ["openid", "product:buy"],
  audience: process.env["SHOP_API_AUDIENCE"]!, // Auth0で作成したAPIのIdentifier
});

このラッパー関数を、AIが使用するツール(shopOnlineTool)に適用します。

// エージェント側のツール定義
const tools = [
  withAsyncAuthorization(shopOnlineTool),
];

この実装で、ツールが呼ばれる直前にCIBAフローが走り、承認が得られるまで実行がブロックされるようになります。

なぜこれが重要なのか?

想定される事故シナリオ

もしユーザーが少し曖昧に「靴を買っておいて」とだけ指示したとします。
AIが勝手に気を利かせて「高級スニーカーを10足買う」と判断してしまった場合、非常に困ります。

しかし、この実装が入っていれば、ユーザーの手元のスマホには、以下のような通知が届きます。

Do you want to buy 10 Luxury Sneakers?
[承認 (Allow)] [拒否(Deny)]

ここでユーザーは、「10足はいかん!」と気づき、[拒否] ボタンを押すことで事故を未然に防ぐことができます。

もしこれが単なる「承認しますか?」だけの通知だったら、ユーザーは流れ作業で承認してしまい、誤発注が発生するかも知れません。
AIが生成したパラメータ(個数や商品名)を、改ざん不可能な別経路(バックチャネル)で人間に提示する。
この仕組み(Binding Message)こそが、実務でAIエージェントを使う上での大事になると感じました。

最後に

前回と今回で、Auth0 for AI Agentsの2つの主要機能を見てきました。

  • Readの制御: Token Exchangeにより、AIは「そのユーザーが見て良いデータ」しか参照できなくなる。
  • Writeの制御: CIBAにより、AIは「人間が承認したアクション」しか実行できなくなる。

AIエージェントを利用するアプリを実装する際、特有の気をつけるべきことがあると理解できました。

以上です。

この記事をシェアする

FacebookHatena blogX

関連記事