Configuration des SDK pour plusieurs domaines personnalisés
Découvrez comment configurer les SDK Auth0 pour qu’ils fonctionnent avec plusieurs domaines personnalisés.
Lorsque vous utilisez plusieurs domaines personnalisés, vous devez configurer vos SDK Auth0 pour qu’ils utilisent le domaine personnalisé approprié pour l’authentification. Ce guide explique la configuration des SDK sur différentes plateformes et dans différents scénarios.
Tous les SDK Auth0 exigent un paramètre domain qui indique quel domaine Auth0 utiliser pour l’authentification. Si vous utilisez des domaines personnalisés, définissez ce paramètre sur votre domaine personnalisé plutôt que sur votre domaine canonique Auth0.Sans domaine personnalisé :
Lorsque vous utilisez MCD, le client est responsable de fournir et de valider tous les domaines personnalisés. Lorsque vous configurez les SDK pour résoudre les domaines personnalisés du locataire à l’aide des fonctions de résolution de domaine, vous devez vous assurer que tous les domaines résolus sont dignes de confiance. Une mauvaise configuration du résolveur de domaine peut permettre de contourner l’authentification auprès de la partie de confiance ou exposer l’application à une falsification de requêtes côté serveur. Si vos domaines et vos serveurs proxy ne sont pas configurés correctement, cela peut créer des vulnérabilités de sécurité critiques dont Okta ne peut être tenue responsable.
Pour les applications Next.js qui utilisent le SDK Next.js d’Auth0 (v4+) :Concepts clés de MCD avec Next.js :
Un seul locataire Auth0, plusieurs domaines : Tous les domaines personnalisés partagent le même clientId et le même clientSecret, puisqu’ils appartiennent au même locataire Auth0.
Fonction DomainResolver : Le paramètre domain accepte une fonction (config: { headers: Headers; url?: URL }) => Promise<string> | string. Cela permet de résoudre le domaine dynamiquement pour chaque requête selon les en-têtes de la requête entrante.
Mise en cache des instances : Le SDK met automatiquement en cache les instances Auth0Client par domaine au moyen d’un cache LRU borné (maximum de 100 entrées) afin d’améliorer les performances.
Isolation des sessions : Les sessions créées au moyen d’un domaine personnalisé sont isolées à ce domaine et ne peuvent pas être utilisées de façon interchangeable avec des sessions d’un autre domaine.
Paramètre URL : Le paramètre url dans le résolveur vaut undefined dans les Server Components et les Server Actions; il est seulement disponible dans le middleware ou les routes d’API.
Ajustement du cache de découverte : Configurez la mise en cache des métadonnées OIDC avec l’option discoveryCache :
const auth0 = new Auth0Client({ // ... autre configuration discoveryCache: { ttl: 600, // Mettre en cache pendant 10 minutes (par défaut) maxEntries: 100 // Nombre maximal d’émetteurs mis en cache (par défaut : 100, éviction LRU) }});
class AuthManager(private val context: Context) { private val clientId = "YOUR_CLIENT_ID" private fun getAuth0Domain(): String { // Récupérer depuis les préférences partagées ou la configuration de l'app val prefs = context.getSharedPreferences("auth", Context.MODE_PRIVATE) return prefs.getString("auth0_domain", "login.example.com") ?: "login.example.com" } fun login(callback: Callback<Credentials, AuthenticationException>) { val account = Auth0.getInstance(clientId, getAuth0Domain()) WebAuthProvider.login(account) .withScheme("demo") .withScope("openid profile email") .start(context, callback) }}
Les SDK de gestion permettent d’interagir avec la Management API d’Auth0. Si vous utilisez des domaines personnalisés, vous devrez peut-être inclure l’en-tête auth0-custom-domain ou utiliser le domaine par défaut.
import { ManagementClient, CustomDomainHeader } from "auth0";// Domaine personnalisé global (envoyé sur toutes les requêtes sur liste blanche)const management = new ManagementClient({ domain: 'tenant.auth0.com', clientId: 'YOUR_M2M_CLIENT_ID', clientSecret: 'YOUR_M2M_CLIENT_SECRET', withCustomDomainHeader: 'login.example.com', });// Lister les utilisateurs (point de terminaison sur liste blanche - l'en-tête est envoyé automatiquement)const users = await management.users.getAll();// Remplacement par requête (a la priorité sur le global)const reqOptions = { ...CustomDomainHeader("specific-user-request.exampleco.com"),};const response = await management.users.getAll({}, reqOptions);
from auth0.management import ManagementClient, CustomDomainHeader# Domaine personnalisé global (envoyé pour toutes les requêtes sur liste blanche)client = ManagementClient( domain='tenant.auth0.com', client_id='YOUR_M2M_CLIENT_ID', client_secret='YOUR_M2M_CLIENT_SECRET', custom_domain='login.example.com',)# Lister les utilisateurs (point de terminaison sur liste blanche - l'en-tête est envoyé automatiquement)users = client.users.list()# Remplacement par requête (a la priorité sur le global)client.users.create( connection='Username-Password-Authentication', email='user@example.com', password='SecurePass123!', request_options=CustomDomainHeader('login.brand2.com'),)
import ( "context" management "github.com/auth0/go-auth0/v2/management/client" "github.com/auth0/go-auth0/v2/management/option")// Niveau application : applique automatiquement l'en-tête de domaine personnalisé aux points de terminaison sur liste blanchemgmt, err := management.New( "{yourDomain}", option.WithClientCredentials("{yourClientId}", "{yourClientSecret}"), option.WithCustomDomainHeader("login.example.com"),)if err != nil { // Gérer l'erreur}// Lister les utilisateurs (point de terminaison sur liste blanche - l'en-tête est envoyé automatiquement)userList, err := mgmt.Users.List(context.Background(), nil)// Remplacement par requête (a la priorité sur le niveau application)userList, err := mgmt.Users.List( context.Background(), nil, option.WithCustomDomainHeader("specific-request.exampleco.com"),)
Lorsque vous utilisez des domaines personnalisés, mettez à jour la validation de votre jeton pour qu’elle accepte le domaine personnalisé comme émetteur.
Utilisez des variables d’environnement : stockez les domaines personnalisés dans des fichiers de configuration propres à chaque environnement
Validez plusieurs émetteurs : si vous utilisez plusieurs domaines personnalisés, configurez la validation des jetons pour les accepter tous comme émetteurs valides
Mettez à jour les URL de rappel : assurez-vous que tous les domaines personnalisés sont ajoutés à Allowed Callback URLs dans les paramètres de l’application
Testez de façon approfondie : testez l’authentification avec chaque domaine personnalisé avant la mise en production
Surveillez les émetteurs de jetons : consignez et surveillez la revendication iss dans les jetons pour vous assurer que le bon domaine personnalisé est utilisé
Documentez les mappages de domaines : tenez à jour une documentation claire indiquant quelles applications utilisent quels domaines personnalisés
Gérez correctement les échecs : implémentez une gestion des erreurs appropriée pour les échecs d’authentification
Mettez en cache JWKS : mettez en cache les données JWKS pour améliorer les performances et réduire le nombre de requêtes