Firebase
@mastra/auth-firebase 包使用 Firebase Authentication 为 Mastra 提供身份验证。它使用 Firebase ID 令牌验证传入请求,并通过 auth 选项与 Mastra 服务器集成。
前置条件前置条件的直接链接
本示例使用 Firebase Authentication。请确保:
- 在 Firebase Console 中创建 Firebase 项目
- 启用 Authentication 并配置首选登录方式(Google、电子邮箱/密码等)
- 从 Project Settings > Service Accounts 生成服务账户密钥
- 下载服务账户 JSON 文件
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
- pnpm
- Yarn
- Bun
npm install @mastra/auth-firebase@latest
pnpm add @mastra/auth-firebase@latest
yarn add @mastra/auth-firebase@latest
bun add @mastra/auth-firebase@latest
用法示例用法示例的直接链接
使用环境变量的基本用法使用环境变量的基本用法的直接链接
设置所需环境变量(FIREBASE_SERVICE_ACCOUNT 和 FIRESTORE_DATABASE_ID)后,可以不带任何构造函数参数初始化 MastraAuthFirebase。该类会自动读取这些环境变量作为配置:
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(),
},
})
自定义配置自定义配置的直接链接
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 集合。该集合中是否存在相应文档决定用户是否获得授权。
user_access/
{user_uid_1}/ // Document exists = user authorized
{user_uid_2}/ // Document exists = user authorized
要自定义用户授权,请提供自定义 authorizeUser 函数:
import { MastraAuthFirebase } from '@mastra/auth-firebase'
const firebaseAuth = new MastraAuthFirebase({
authorizeUser: async user => {
// Custom authorization logic
return user.email?.endsWith('@yourcompany.com') || false
},
})
有关所有可用配置选项,请参阅 MastraAuthFirebase。
客户端设置客户端设置的直接链接
使用 Firebase 身份验证时,需要在客户端初始化 Firebase、对用户进行身份验证,并获取 ID 令牌以传递给 Mastra 请求。
在客户端设置 Firebase在客户端设置 Firebase的直接链接
首先,在客户端应用中初始化 Firebase:
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 令牌:
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 文档。
配置 MastraClientconfiguring-mastraclient的直接链接
启用 auth 后,使用 MastraClient 发出的所有请求都必须在 Authorization 标头中包含有效的 Firebase ID 令牌:
import { MastraClient } from '@mastra/client-js'
export const createMastraClient = (idToken: string) => {
return new MastraClient({
baseUrl: 'https://<mastra-api-url>',
headers: {
Authorization: `Bearer ${idToken}`,
},
})
}
ID 令牌在 Authorization 标头中必须带有 Bearer 前缀。
有关更多配置选项,请参阅 Mastra Client SDK。
发出经过身份验证的请求发出经过身份验证的请求的直接链接
使用 Firebase ID 令牌配置 MastraClient 后,即可发送经过身份验证的请求:
- React
- Node.js
- cURL
'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 (
<button onClick={handleClick} disabled={!user}>
Test Agent
</button>
)
}
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 -X POST http://localhost:4111/api/agents/weatherAgent/generate \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <your-firebase-id-token>" \
-d '{
"messages": "Weather in London"
}'