Aller au contenu principal

Auth0

Le package @mastra/auth-auth0 fournit une authentification Auth0 à Mastra. Il vérifie les requêtes entrantes au moyen de jetons JWT émis par Auth0 et s’intègre au serveur Mastra grâce à l’option auth.

Prérequis
Lien direct vers Prérequis

Cet exemple utilise l’authentification Auth0. Assurez-vous de :

  1. Créer un compte Auth0 sur auth0.com
  2. Configurer une application dans votre tableau de bord Auth0
  3. Configurer une API avec un identifiant (audience) dans votre tableau de bord Auth0
  4. Configurer les URL de rappel, les origines web et les URL de déconnexion autorisées pour votre application
.env
AUTH0_DOMAIN=your-tenant.auth0.com
AUTH0_AUDIENCE=your-api-identifier
remarque

Vous trouverez votre domaine dans le tableau de bord Auth0, sous Applications > Settings. L’audience correspond à l’identifiant de votre API configuré dans Auth0 Dashboard > APIs.

Pour obtenir des instructions de configuration détaillées, consultez les guides de démarrage rapide Auth0 propres à votre plateforme.

Installation
Lien direct vers Installation

Avant de pouvoir utiliser la classe MastraAuthAuth0, vous devez installer le package @mastra/auth-auth0.

npm install @mastra/auth-auth0@latest

Exemples d’utilisation
Lien direct vers Exemples d’utilisation

Utilisation de base avec des variables d’environnement
Lien direct vers Utilisation de base avec des variables d’environnement

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { MastraAuthAuth0 } from '@mastra/auth-auth0'

export const mastra = new Mastra({
server: {
auth: new MastraAuthAuth0(),
},
})

Configuration personnalisée
Lien direct vers Configuration personnalisée

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { MastraAuthAuth0 } from '@mastra/auth-auth0'

export const mastra = new Mastra({
server: {
auth: new MastraAuthAuth0({
domain: process.env.AUTH0_DOMAIN,
audience: process.env.AUTH0_AUDIENCE,
}),
},
})

Configuration
Lien direct vers Configuration

Autorisation des utilisateurs
Lien direct vers Autorisation des utilisateurs

Par défaut, MastraAuthAuth0 autorise tous les utilisateurs authentifiés qui possèdent des jetons Auth0 valides pour l’audience indiquée. La vérification du jeton garantit que :

  1. Le jeton est correctement signé par Auth0
  2. Le jeton n’a pas expiré
  3. L’audience du jeton correspond à celle que vous avez configurée
  4. L’émetteur du jeton correspond à votre domaine Auth0

Pour personnaliser l’autorisation des utilisateurs, fournissez une fonction authorizeUser personnalisée :

src/mastra/auth.ts
import { MastraAuthAuth0 } from '@mastra/auth-auth0'

const auth0Provider = new MastraAuthAuth0({
authorizeUser: async user => {
// Custom authorization logic
return user.email?.endsWith('@yourcompany.com') || false
},
})

Consultez la page MastraAuthAuth0 pour découvrir toutes les options de configuration disponibles.

Configuration côté client
Lien direct vers Configuration côté client

Lorsque vous utilisez l’authentification Auth0, vous devez configurer le SDK React Auth0, authentifier les utilisateurs et récupérer leurs jetons d’accès afin de les transmettre à vos requêtes Mastra.

Configurer le SDK React Auth0
Lien direct vers Configurer le SDK React Auth0

Commencez par installer et configurer le SDK React Auth0 dans votre application :

npm install @auth0/auth0-react
src/auth0-provider.tsx
import React from 'react'
import { Auth0Provider } from '@auth0/auth0-react'

const Auth0ProviderWithHistory = ({ children }) => {
return (
<Auth0Provider
domain={process.env.REACT_APP_AUTH0_DOMAIN}
clientId={process.env.REACT_APP_AUTH0_CLIENT_ID}
authorizationParams={{
redirect_uri: window.location.origin,
audience: process.env.REACT_APP_AUTH0_AUDIENCE,
scope: 'read:current_user update:current_user_metadata',
}}
>
{children}
</Auth0Provider>
)
}

export default Auth0ProviderWithHistory

Récupérer les jetons d’accès
Lien direct vers Récupérer les jetons d’accès

Utilisez le SDK React Auth0 pour authentifier les utilisateurs et récupérer leurs jetons d’accès :

lib/auth.ts
import { useAuth0 } from '@auth0/auth0-react'

export const useAuth0Token = () => {
const { getAccessTokenSilently } = useAuth0()

const getAccessToken = async () => {
const token = await getAccessTokenSilently()
return token
}

return { getAccessToken }
}
remarque

Consultez la documentation du SDK React Auth0 pour découvrir d’autres méthodes d’authentification et options de configuration.

Configurer MastraClient
Lien direct vers configuring-mastraclient

Lorsque auth est activée, toutes les requêtes effectuées avec MastraClient doivent inclure un jeton d’accès Auth0 valide dans l’en-tête Authorization :

lib/mastra/mastra-client.ts
import { MastraClient } from '@mastra/client-js'

export const createMastraClient = (accessToken: string) => {
return new MastraClient({
baseUrl: 'https://<mastra-api-url>',
headers: {
Authorization: `Bearer ${accessToken}`,
},
})
}
info

Le jeton d’accès doit être précédé de Bearer dans l’en-tête Authorization.

Consultez le SDK client Mastra pour davantage d’options de configuration.

Effectuer des requêtes authentifiées
Lien direct vers Effectuer des requêtes authentifiées

Une fois MastraClient configuré avec le jeton d’accès Auth0, vous pouvez envoyer des requêtes authentifiées :

src/components/mastra-api-test.tsx
import React, { useState } from 'react'
import { useAuth0 } from '@auth0/auth0-react'
import { MastraClient } from '@mastra/client-js'

export const MastraApiTest = () => {
const { getAccessTokenSilently } = useAuth0()
const [result, setResult] = useState(null)

const callMastraApi = async () => {
const token = await getAccessTokenSilently()

const mastra = new MastraClient({
baseUrl: 'http://localhost:4111',
headers: {
Authorization: `Bearer ${token}`,
},
})

const weatherAgent = mastra.getAgent('weatherAgent')
const response = await weatherAgent.generate("What's the weather like in New York")

setResult(response.text)
}

return (
<div>
<button onClick={callMastraApi}>Test Mastra API</button>

{result && (
<div className="result">
<h6>Result:</h6>
<pre>{result}</pre>
</div>
)}
</div>
)
}