🦔

Auth0 for AI Agents を理解するために Google カレンダーと連携するサンプルアプリを動かす

に公開

Auth0 for AI Agents は、AIエージェントがユーザーの代わりに外部サービスを利用できるようにする仕組みです。コアとなるマテリアルは「Token Vault + それを活用するためのSDK」だと私は理解しています。

Auth0 for AI Agents が想定している課題

私は、Auth0 for AI Agentsとはなにかを理解するのに時間を要しました。どんな課題を解決しようとしているかに注目すれば腑に落ちやすく理解が進むかもしれません。

AI エージェントの利点として、ユーザーの代わりにさまざまなツール・サービスへアクセスする点がある一方、外部サービスを利用する場合はまずユーザー自身が認証する必要があります。SlackにしてもGoogleにしても、APIトークンはサービスプロバイダーごとに払い出され、アプリケーションはプロバイダーごとにトークンを管理しなければなりません。人間の代わりにいろいろなサービスと連携できることがAIエージェントの強みなのに、連携先を増やすごとにトークン管理が煩雑になってしまいがちです。こうした課題を解決するために Auth0 が Token Vault をひっさげて間に入ってくれるというのがありがたポイントのようです。


https://auth0.com/blog/auth0-token-vault-secure-token-exchange-for-ai-agents/

Genkit のサンプルアプリケーションを動かす

より理解を深めるためには実際に動かしてみるのが一番ですが、イチからアプリを構築するのは大変です。Auth0がサンプルアプリケーションを用意してくれているので、今回はそれを動かすところまでやってみたいと思います。とはいえ、何からやればいいのか迷うところです。実際のところ、ちょっと情報が断片化していて、動かすのに苦労しました。もともとAuth0に理解がある方ならすんなり進められるかもしれません。

ここでは、サンプルアプリケーションのREADMEを読みながら設定を行い、アプリを動かします。
https://github.com/auth0/auth0-ai-js/tree/main/examples/calling-apis/chatbot

以下はサンプルアプリのスクリーンショットですが、LangGraph や GenKit など、いろいろなパターンでチャットボットを試せるようです。

今回は GenKit で試したいと思います。サンプルアプリのチャットで「2025年10月21日 13:00って空いてる?」のように聞くと、Tool calling で Google Calendar の API で問い合わせ、結果を返してくれます。ここまでを目指します。

以下の流れで進めます:

  1. Vertex AI 経由で Gemini を呼び出せるように
  2. Auth0 アプリケーションの設定
  3. Google Cloud で Calendar API と OAuth の設定
  4. アプリケーションの環境変数に設定値を反映
  5. 動作確認

1. Vertex AI 経由で Gemini を呼び出せるように

サンプルアプリは OpenAI を使うとありますが、Vertex AI 経由で Gemini を呼び出すようにします。イキナリ違っててスイマセン。Calendar API を使うのに Google Cloud が必要になるため、ついでに生成AIも Vertex AI で呼び出したいと思いました。ここではローカルからAPI経由でGeminiとやりとりができればOKです。

https://cloud.google.com/vertex-ai/generative-ai/docs/start/quickstart?hl=ja&usertype=adc#googlegenaisdk_textgen_with_txt-drest

こちらのページを参考に設定します。RESTでローカルから呼び出せるか確認してください。

request.sh
GOOGLE_CLOUD_PROJECT=your-project-name
GOOGLE_CLOUD_LOCATION=global
API_ENDPOINT=aiplatform.googleapis.com
MODEL_ID="gemini-2.5-flash"
GENERATE_CONTENT_API="generateContent"

curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://${API_ENDPOINT}/v1/projects/${GOOGLE_CLOUD_PROJECT}/locations/${GOOGLE_CLOUD_LOCATION}/publishers/google/models/${MODEL_ID}:${GENERATE_CONTENT_API}" -d \
$'{
  "contents": {
    "role": "user",
    "parts": {
      "text": "Explain how AI works in a few words"
    }
  }
}'

実行します:

gcloud auth application-default login
bash request.sh

---

{
  "candidates": [
    {
      "content": {
        "role": "model",
        "parts": [
          {
            "text": "AI learns from data to find patterns and make predictions or decisions."
          }
        ]
      },
      "finishReason": "STOP",
      "avgLogprobs": -18.225354708158054
    }
  ],
...

結果が返ってくればOKです。GenKit サンプルアプリケーションを少し修正して、生成AIにVertex AI と Geminiを使うようにします:

cd examples/calling-apis/chatbot/ 
npm i --save @genkit-ai/vertexai 
examples/calling-apis/chatbot/app/(genkit)/lib/genkit.ts
- import { gpt4o, openAI } from "genkitx-openai";
+ import vertexAI, { gemini25FlashLite } from "@genkit-ai/vertexai";
import path from "path";

- export const ai = genkit({
-   plugins: [openAI({ apiKey: process.env.OPENAI_API_KEY })],
-   model: gpt4o,
- });

+ export const ai = genkit({
+   plugins: [
+     vertexAI({
+       location: "us-central1",
+     }),
+   ],
+   model: gemini25FlashLite,
+ });

これで ChatGPTのかわりに Vertex AI から Gemini を呼び出せるようになりました。

2. Auth0 アプリケーションの設定

アプリケーション作成と設定

サンプルアプリのREADMEに従い、Auth0の設定を進めます。

Auth0にログインし、アプリケーションを作成します。名前はなんでもOKです。

設定タブで、以下のようにローカルからログインできるよう設定を加えていきます。

  • 許可するCallback URL: http://localhost:3000/auth/callback
  • 許可するログアウトURL: http://localhost:3000

さらにこのアプリケーションが Token Vault を利用して Google API とトークン交換できるようにします。

同じく設定タブで、詳細設定>付与タイプを開き、Token Vault にチェックを入れてください。

私はこれを忘れていてカレンダーAPIからデータを取得してくれず、かなり時間を費やしてしまいました。

API作成と設定

次に、作成したアプリケーションの資格情報でアクセストークンを要求できるよう、APIを設定します。アプリケーション>API>APIの作成とします。

識別子 は戸惑いますがURLの形式であれば何でもOKです。作成したあと、「アクセスの設定」からユーザー同意のスキップを許可するオフラインでのアクセスを許可するを有効にしました。

アプリケーションに戻り、 API > Google Calendar Relay API を認可済みとしてください。

3. Calendar API と OAuth の設定

こんどは Auth0とGoogleを連携できるようにします。ここの手順は、 Auth0 Marketplace の Google / Gmail ページが一番参考になりました。

https://marketplace.auth0.com/integrations/google-social-connection

このページの Installation タブに設定手順が記載されています。

Google Cloud - Calendar API を有効にする

利用する Google Cloud プロジェクトで、Google Calendar API を有効にしましょう。検索ボックスでGoogle Calendar APIと打ち込めば遷移できます。「有効にする」をクリックしてください。

Google Cloud - Google Auth Platform で承認済みドメインを追加

Google Auth Platform > ブランディング と進み、承認済みドメインauth0.comを追加してください。

Google Cloud - テストユーザーを追加

Google Auth Platform > 対象 へ移り、テストユーザーのメールアドレスを追加します。私は自分の会社のメールアドレスを登録しました。

Google Cloud - スコープを追加(変更なし)

このOAuth認証を介してアプリケーションユーザーが利用できるスコープを決めます。Google Auth Platform > データアクセスへ遷移してください。私はてっきり https://www.googleapis.com/auth/calendar.freebusy のスコープ設定が必要なのかと思いましたが、未設定でも問題なく動きました。もしかしたら Auth0 側でもスコープ設定をするのですが、そこでカバーできているのかもしれません。もしくは非機密のスコープは設定しなくてもいいとか。いずれにせよ何も設定していません。


まっさらなまま

Google Cloud - OAuth 2.0 クライアント追加

Google Auth Platform > クライアント > クライアントを作成 とします。

  • 名前: GenKit Auth0 Test Application
  • 承認済みの JavaScript 生成元: Auth0で作成したアプリ Genkit Google API Sample Appドメイン から持ってきます。https://genai-xxxxxxxxxxxxxxx.jp.auth0.comのような値です。
  • 承認済みのリダイレクト URI: https://genai-xxxxxxxxxxxxxxx.jp.auth0.com/login/callback
  • クライアントシークレット を作成して控えてください。Auth0のgoogle-oauth2ソーシャル接続で利用します。

Auth0 - ソーシャル接続を作成

Auth0に戻ります。認証>ソーシャル>接続を作成>Google/Gmailを選んでください。以下のように設定します。

  • Client ID: Google Cloud で作成したOAuthクライアントのクライアントID
  • Client Secret: 作成して控えたクライアントシークレット

次にPermissionsを設定します。以下を有効にしました。

そして、トークンVaultの有効化をONにしてください。

これで設定は終わりです。「接続を試す」からテストが成功すればなお安心です。

4. アプリケーションの環境変数に設定値を反映

ここまでで、Auth0 アプリケーションと Google API がトークン交換できる状態になりました。この状態を活用し、あとはAIエージェントアプリがAuth0を通して認証できるように設定します。手順は再びサンプルアプリケーションの README へ戻ります。.env.exampleをコピーし、.env.localファイルを編集することがメインの作業です。以下のように埋めていきいます。

examples/calling-apis/chatbot/.env.local
# Auth0 で作成したアプリケーション 「Genkit Google API Sample App」のドメイン
AUTH0_DOMAIN="xxxxxxxxxxxxxxx.jp.auth0.com" 

# Auth0 で作成したアプリケーション 「Genkit Google API Sample App」のクライアントID
AUTH0_CLIENT_ID="sample2asdf12dkvaadsflK" 

# Auth0 で作成したアプリケーション 「Genkit Google API Sample App」の クライアントシークレット
AUTH0_CLIENT_SECRET="BBBBBBBBBBBYYYYYYYYYYYLLLLLLLLLKKKK" 

# openssl rand -hex 32 を実行した結果
AUTH0_SECRET="4ru8q347598327513948751349878a9sdfuas8d9f" 
APP_BASE_URL=http://localhost:3000

# the offline_access scope is needed if your flow is using a refresh token
# AUTH0_SCOPE='openid profile email offline_access'

# Langgraph API audience (only needed for Langgraph example)
# AUTH0_AUDIENCE="<auth0-audience>"
# NEXT_PUBLIC_URL="http://localhost:3000"

# OpenAI
# OPENAI_API_KEY=xx-xxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxx

# LANGGRAPH
# 今回は使わないですが、環境変数が設定されていないとビルドエラーになるのでこのままにしてください
LANGGRAPH_API_URL=http://localhost:54367 
# Auth0 Resource Server Client Configuration (for token exchange with Token Vault)
# These credentials belong to a special "resource_server" client that can perform token exchanges
# on behalf of the user within your Langgraph API
# RESOURCE_SERVER_CLIENT_ID="<your-resource-server-client-id>"
# RESOURCE_SERVER_CLIENT_SECRET="<your-resource-server-client-secret>"

#remove node.js deprecations warnings
NODE_OPTIONS="--no-deprecation"

サンプル・アプリケーションの準備ができました。

5. 動作確認

アプリを動かしましょう。サンプルアプリケーションはローカルのビルド成果物を参照するようなので、まずビルドから行います。

cd /Users/mememe/ghq/github.com/cm-wada-yusuke/auth0-ai-js # プロジェクトルートに行ってください
npm install
npm run build

次に開発サーバーを起動します。

cd examples/calling-apis/chatbot/ 
npm run dev

http://localhost:3000 へアクセスします。Google ログインしましょう。

Google からプロフィール情報の取得に合意するよう言われるので、Acceptします。

GenKitへ。

チャット画面になります。手始めに「私のメールアドレスは?」と聞いてみてください。

合ってます。では、カレンダーとの接続を確認しましょう。「2025年10月21日16:00+09:00の予定は空いてる?」など、実際にカレンダーが空いている・埋まっている時刻を指定して聞いてみてください。

これがたぶんGenKitのTool Callingですかね。カレンダーへ接続するため、再度認証することになります。

カレンダーのスケジュールを確認する権限も入っていることがわかります。

実際、10月24日の16時はGoogleカレンダーに予定が入っています。Tool Calling で Google Calendar からデータを取得できていることがわかります。やりたいことが実現できました。

まとめ

サンプルアプリケーションで、Auth0 for AI Agentsを試すことができました。アプリケーションが直接Googleとの認証を行うのではなく、Auth0が間に入ってくれていることがわかります。今回は Google Calendar API のみでしたが、連携するAPIが増えたときにAuth0を挟む優位性が上がっていくことでしょう。AI エージェントがよりエージェントらしく高速にふるまうため、認証・認可を肩代わりしてくれるありがたさを実感しました。みなさまもぜひ試してみてください。

Discussion