Better Auth
Le package @mastra/auth-better-auth fournit l'authentification Better Auth à Mastra. Il vérifie les requêtes entrantes au moyen de votre instance Better Auth et s'intègre au serveur Mastra via l'option server.auth.
PrérequisLien direct vers Prérequis
Cet exemple utilise Better Auth. Vérifiez que votre instance Better Auth est configurée et que vos variables d'environnement sont définies.
# Required by Better Auth
BETTER_AUTH_SECRET=... # at least 32 chars
BETTER_AUTH_URL=http://localhost:3000
# Example DB URL used by the snippet below (adjust for your setup)
DATABASE_URL=postgres://...
Pour des raisons de sécurité et de stabilité, Better Auth recommande de définir explicitement baseURL (ou de le faire au moyen de BETTER_AUTH_URL).
Si vous n'avez pas encore monté le gestionnaire de Better Auth afin que votre application puisse connecter les utilisateurs et créer des sessions, suivez le guide d'installation de Better Auth pour monter la route /api/auth/* (ou le chemin de base que vous avez configuré).
InstallationLien direct vers Installation
Installez le package @mastra/auth-better-auth :
- npm
- pnpm
- Yarn
- Bun
npm install @mastra/auth-better-auth
pnpm add @mastra/auth-better-auth
yarn add @mastra/auth-better-auth
bun add @mastra/auth-better-auth
Exemple d'utilisationLien direct vers Exemple d'utilisation
Commencez par créer votre instance Better Auth :
import { betterAuth } from 'better-auth'
export const auth = betterAuth({
database: {
provider: 'postgresql',
url: process.env.DATABASE_URL!,
},
emailAndPassword: {
enabled: true,
},
baseURL: process.env.BETTER_AUTH_URL,
secret: process.env.BETTER_AUTH_SECRET,
})
Utilisez-la ensuite avec Mastra :
import { Mastra } from '@mastra/core'
import { MastraAuthBetterAuth } from '@mastra/auth-better-auth'
import { auth } from '@/lib/auth'
const mastraAuth = new MastraAuthBetterAuth({
auth,
})
export const mastra = new Mastra({
server: {
auth: mastraAuth,
},
})
Consultez MastraAuthBetterAuth pour découvrir toutes les options de configuration disponibles.
Autorisation personnaliséeLien direct vers Autorisation personnalisée
const mastraAuth = new MastraAuthBetterAuth({
auth,
async authorizeUser(user) {
// Example: only allow verified emails
return user?.user?.emailVerified === true
},
})
Configuration des routesLien direct vers Configuration des routes
const mastraAuth = new MastraAuthBetterAuth({
auth,
public: ['/health', '/api/status'],
protected: ['/api/*', '/admin/*'],
})
Règles de correspondanceLien direct vers Règles de correspondance
publicetprotectedacceptent des chemins exacts, des motifs avec caractères génériques (comme/api/*) et des paramètres de chemin (comme/users/:id).- Pour définir des règles propres à une méthode, utilisez des tuples comme
["/api/agents", ["GET", "POST"]]. - Si une route correspond à la fois à
publicet àprotected,publicl'emporte et aucune authentification n'est requise. - Si aucune règle ne correspond, les routes sont considérées comme protégées par défaut, sauf si une route porte explicitement le marqueur
requiresAuth: false.
Configuration côté clientLien direct vers Configuration côté client
Lorsque l'authentification est activée, les requêtes adressées aux routes intégrées de Mastra doivent être authentifiées. En pratique, votre client doit donc envoyer l'identifiant utilisé par votre configuration Better Auth pour les requêtes authentifiées.
Session par cookie (recommandé)Lien direct vers Session par cookie (recommandé)
Si votre configuration Better Auth utilise des cookies, configurez le client pour qu'il envoie les identifiants. Pour les requêtes interorigines (par exemple Next.js sur :3000 appelant Mastra sur :4111), activez la transmission des identifiants CORS sur le serveur Mastra :
export const mastra = new Mastra({
server: {
auth: mastraAuth,
cors: {
origin: 'http://localhost:3000', // your frontend origin
credentials: true,
},
},
})
Configurez ensuite le client pour inclure les identifiants :
import { MastraClient } from '@mastra/client-js'
export const mastraClient = new MastraClient({
baseUrl: 'http://localhost:4111',
credentials: 'include',
})
Si vous appelez directement l'API, incluez également les identifiants dans fetch :
await fetch('http://localhost:4111/api/agents/weatherAgent/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
credentials: 'include',
body: JSON.stringify({ messages: 'Weather in London' }),
})
Jeton BearerLien direct vers Jeton Bearer
Vous pouvez transmettre le jeton de session signé comme jeton Bearer. Récupérez-le depuis la session de votre client Better Auth et incluez-le dans l'en-tête Authorization :
import { MastraClient } from '@mastra/client-js'
import { authClient } from './auth-client' // your Better Auth client
const session = await authClient.getSession()
export const mastraClient = new MastraClient({
baseUrl: 'http://localhost:4111',
headers: {
Authorization: `Bearer ${session.data?.session.token}`,
},
})
Consultez le SDK client Mastra pour davantage d’options de configuration.
Effectuer des requêtes authentifiéesLien direct vers Effectuer des requêtes authentifiées
- React
- cURL
import { mastraClient } from '../lib/mastra-client'
export const TestAgent = () => {
async function handleClick() {
const agent = mastraClient.getAgent('weatherAgent')
const response = await agent.generate('Weather in London')
console.log(response)
}
return <button onClick={handleClick}>Test Agent</button>
}
curl -X POST http://localhost:4111/api/agents/weatherAgent/generate \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <your-token>" \
-d '{
"messages": "Weather in London"
}'
DépannageLien direct vers Dépannage
- Réponse 401 à chaque requête : vérifiez que le gestionnaire Better Auth est monté et que votre application peut créer une session valide. Assurez-vous que le client envoie soit un cookie de session, soit un en-tête
Authorization: Bearer <signed-token>. - Cookies non envoyés entre origines : définissez
credentials: "include"dansMastraClient, puis configurezserver.corsavec l'origine de votre frontend etcredentials: true. - Jeton Bearer rejeté : veillez à transmettre le jeton de session signé complet, obtenu depuis
authClient.getSession(), et non un jeton brut ou non signé. - Problèmes d'URL de base : définissez
baseURLdansbetterAuth({ ... })ou définissezBETTER_AUTH_URL. - Erreurs de connexion à la base de données : vérifiez
DATABASE_URLet la configuration du Provider de base de données.