> Discover all available pages from the documentation index: https://mastra.zisheng.pro/ja/llms.txt # Firebase `@mastra/auth-firebase` パッケージは、Firebase Authentication を使用した Mastra の認証を提供します。Firebase ID トークンを使って受信リクエストを検証し、`auth` オプションで Mastra サーバーと統合します。 ## 前提条件 この例では Firebase Authentication を使用します。次の準備を行ってください。 1. [Firebase Console](https://console.firebase.google.com/) で Firebase プロジェクトを作成する 2. Authentication を有効にし、使用するログイン方法(Google、メールアドレスとパスワードなど)を設定する 3. Project Settings > Service Accounts からサービスアカウントキーを生成する 4. サービスアカウントの JSON ファイルをダウンロードする ```env FIREBASE_SERVICE_ACCOUNT=/path/to/your/service-account-key.json FIRESTORE_DATABASE_ID=(default) # Alternative environment variable names: # FIREBASE_DATABASE_ID=(default) ``` > **注記:** サービスアカウントの JSON ファイルは安全に保管し、バージョン管理には絶対にコミットしないでください。 ## インストール `MastraAuthFirebase` クラスを使用するには、事前に `@mastra/auth-firebase` パッケージをインストールする必要があります。 **npm**: ```bash npm install @mastra/auth-firebase@latest ``` **pnpm**: ```bash pnpm add @mastra/auth-firebase@latest ``` **Yarn**: ```bash yarn add @mastra/auth-firebase@latest ``` **Bun**: ```bash bun add @mastra/auth-firebase@latest ``` ## 使用例 ### 環境変数を使用する基本的な構成 必要な環境変数(`FIREBASE_SERVICE_ACCOUNT` と `FIRESTORE_DATABASE_ID`)を設定すると、コンストラクター引数なしで `MastraAuthFirebase` を初期化できます。クラスはこれらの環境変数を設定として自動的に読み込みます。 ```typescript import { Mastra } from '@mastra/core' import { MastraAuthFirebase } from '@mastra/auth-firebase' // Automatically uses FIREBASE_SERVICE_ACCOUNT and FIRESTORE_DATABASE_ID env vars export const mastra = new Mastra({ server: { auth: new MastraAuthFirebase(), }, }) ``` ### カスタム設定 ```typescript import { Mastra } from '@mastra/core' import { MastraAuthFirebase } from '@mastra/auth-firebase' export const mastra = new Mastra({ server: { auth: new MastraAuthFirebase({ serviceAccount: '/path/to/service-account.json', databaseId: 'your-database-id', }), }, }) ``` ## 設定 `MastraAuthFirebase` クラスは、コンストラクターオプションまたは環境変数で設定できます。 ### 環境変数 - `FIREBASE_SERVICE_ACCOUNT`: Firebase サービスアカウントの JSON ファイルへのパス - `FIRESTORE_DATABASE_ID` または `FIREBASE_DATABASE_ID`: Firestore データベース ID > **注記:** コンストラクターオプションを指定しない場合、クラスはこれらの環境変数を自動的に読み込みます。そのため、環境変数が正しく設定されていれば、引数なしで `new MastraAuthFirebase()` を呼び出せます。 ### ユーザー認可 デフォルトでは、`MastraAuthFirebase` は Firestore を使用してユーザーアクセスを管理します。ユーザー UID をキーとするドキュメントを格納した `user_access` コレクションを前提としています。このコレクションにドキュメントが存在するかどうかで、ユーザーが認可されているかを判定します。 ```text user_access/ {user_uid_1}/ // Document exists = user authorized {user_uid_2}/ // Document exists = user authorized ``` ユーザー認可をカスタマイズするには、カスタムの `authorizeUser` 関数を指定します。 ```typescript import { MastraAuthFirebase } from '@mastra/auth-firebase' const firebaseAuth = new MastraAuthFirebase({ authorizeUser: async user => { // Custom authorization logic return user.email?.endsWith('@yourcompany.com') || false }, }) ``` 利用可能なすべての設定オプションについては、[MastraAuthFirebase](https://mastra.zisheng.pro/ja/reference/auth/firebase) を参照してください。 ## クライアント側の設定 Firebase 認証を使用する場合は、クライアント側で Firebase を初期化してユーザーを認証し、ID トークンを取得して Mastra へのリクエストに渡す必要があります。 ### クライアントでの Firebase の設定 まず、クライアントアプリケーションで Firebase を初期化します。 ```typescript import { initializeApp } from 'firebase/app' import { getAuth, GoogleAuthProvider } from 'firebase/auth' const firebaseConfig = { apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY, authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID, } const app = initializeApp(firebaseConfig) export const auth = getAuth(app) export const googleProvider = new GoogleAuthProvider() ``` ### ユーザーの認証とトークンの取得 Firebase Authentication を使用してユーザーをログインさせ、ID トークンを取得します。 ```typescript import { signInWithPopup, signOut, User } from 'firebase/auth' import { auth, googleProvider } from './firebase' export const signInWithGoogle = async () => { try { const result = await signInWithPopup(auth, googleProvider) return result.user } catch (error) { console.error('Error signing in:', error) throw error } } export const getIdToken = async (user: User) => { try { const idToken = await user.getIdToken() return idToken } catch (error) { console.error('Error getting ID token:', error) throw error } } export const signOutUser = async () => { try { await signOut(auth) } catch (error) { console.error('Error signing out:', error) throw error } } ``` > **注記:** メールアドレスとパスワード、電話番号認証など、その他の認証方法については、[Firebase ドキュメント](https://firebase.google.com/docs/auth)を参照してください。 ## `MastraClient` の設定 `auth` を有効にすると、`MastraClient` から送信するすべてのリクエストで、`Authorization` ヘッダーに有効な Firebase ID トークンを含める必要があります。 ```typescript import { MastraClient } from '@mastra/client-js' export const createMastraClient = (idToken: string) => { return new MastraClient({ baseUrl: 'https://', headers: { Authorization: `Bearer ${idToken}`, }, }) } ``` > **情報:** Authorization ヘッダーでは、ID トークンに `Bearer` プレフィックスを付ける必要があります。 > > その他の設定オプションについては、[Mastra Client SDK](https://mastra.zisheng.pro/ja/docs/server/mastra-client) を参照してください。 ### 認証済みリクエストの送信 Firebase ID トークンを使って `MastraClient` を設定すると、認証済みリクエストを送信できます。 **React**: ```tsx 'use client' import { useAuthState } from 'react-firebase-hooks/auth' import { MastraClient } from '@mastra/client-js' import { auth } from '../lib/firebase' import { getIdToken } from '../lib/auth' export const TestAgent = () => { const [user] = useAuthState(auth) async function handleClick() { if (!user) return const token = await getIdToken(user) const client = createMastraClient(token) const weatherAgent = client.getAgent('weatherAgent') const response = await weatherAgent.generate("What's the weather like in New York") console.log({ response }) } return ( ) } ``` **Node.js**: ```typescript const express = require('express') const admin = require('firebase-admin') const { MastraClient } = require('@mastra/client-js') // Initialize Firebase Admin admin.initializeApp({ credential: admin.credential.cert({ // Your service account credentials }), }) const app = express() app.use(express.json()) app.post('/generate', async (req, res) => { try { const { idToken } = req.body // Verify the token await admin.auth().verifyIdToken(idToken) const mastra = new MastraClient({ baseUrl: 'http://localhost:4111', headers: { Authorization: `Bearer ${idToken}`, }, }) const weatherAgent = mastra.getAgent('weatherAgent') const response = await weatherAgent.generate("What's the weather like in Nairobi") res.json({ response: response.text }) } catch (error) { res.status(401).json({ error: 'Unauthorized' }) } }) ``` **cURL**: ```bash curl -X POST http://localhost:4111/api/agents/weatherAgent/generate \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "messages": "Weather in London" }' ```