Configuración de SDK para varios dominios personalizados
Aprende a configurar los SDK de Auth0 para que funcionen con varios dominios personalizados.
Al usar varios dominios personalizados, debe configurar sus SDK de Auth0 para usar el dominio personalizado adecuado para la autenticación. Esta guía abarca la configuración de los SDK para distintas plataformas y escenarios.
Todos los SDK de Auth0 requieren un parámetro domain que especifica qué dominio de Auth0 se usará para la autenticación. Si usa dominios personalizados, establezca este parámetro en su dominio personalizado en lugar del dominio canónico de Auth0.Sin dominio personalizado:
Al usar MCD, el cliente es responsable de proporcionar y validar todos los dominios personalizados. Al configurar los SDK para resolver los dominios personalizados del Tenant mediante las funciones de resolución de dominios, usted es responsable de garantizar que todos los dominios resueltos sean de confianza. Una configuración incorrecta del resolvedor de dominios puede permitir la omisión de la autenticación en la relying party o exponer la aplicación a falsificación de solicitudes del lado del servidor. No configurar correctamente sus dominios y servidores proxy puede generar vulnerabilidades críticas de seguridad por las que Okta no asume ninguna responsabilidad.
Para aplicaciones de Next.js que usan el SDK de Auth0 para Next.js (v4+):Conceptos clave de MCD con Next.js:
Un solo Tenant de Auth0, varios dominios: Todos los dominios personalizados comparten el mismo clientId y clientSecret, ya que pertenecen al mismo Tenant de Auth0.
Función DomainResolver: El parámetro domain acepta una función (config: { headers: Headers; url?: URL }) => Promise<string> | string. Esto permite resolver el dominio dinámicamente para cada solicitud en función de los encabezados de la solicitud entrante.
Almacenamiento en caché de instancias: El SDK almacena automáticamente en caché las instancias de Auth0Client por dominio mediante una caché LRU acotada (máximo 100 entradas) para mejorar el rendimiento.
Aislamiento de sesiones: Las sesiones creadas a través de un dominio personalizado quedan aisladas en ese dominio y no pueden usarse indistintamente con sesiones de otro dominio.
Parámetro URL: El parámetro url del resolvedor es undefined en Server Components y Server Actions; solo está disponible en middleware o rutas de API.
Ajuste de la caché de descubrimiento: Configura el almacenamiento en caché de los metadatos de OIDC con la opción discoveryCache:
const auth0 = new Auth0Client({ // ... otra configuración discoveryCache: { ttl: 600, // Caché durante 10 minutos (predeterminado) maxEntries: 100 // Número máximo de emisores almacenados en caché (predeterminado: 100, expulsión LRU) }});
import com.auth0.android.Auth0import com.auth0.android.authentication.AuthenticationAPIClientimport com.auth0.android.provider.WebAuthProviderimport com.auth0.android.result.Credentialsval account = Auth0.getInstance( "YOUR_CLIENT_ID", "login.example.com" // Tu dominio personalizado)WebAuthProvider.login(account) .withScheme("demo") .withScope("openid profile email") .start(this, object : Callback<Credentials, AuthenticationException> { override fun onSuccess(credentials: Credentials) { // Manejar el éxito } override fun onFailure(exception: AuthenticationException) { // Manejar el error } })
Para admitir varios dominios:
class AuthManager(private val context: Context) { private val clientId = "YOUR_CLIENT_ID" private fun getAuth0Domain(): String { // Recuperar de las preferencias compartidas o la configuración de la aplicación 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) }}
Los SDK de administración se utilizan para interactuar con la Management API de Auth0. Al usar dominios personalizados, es posible que deba incluir el encabezado auth0-custom-domain o usar el dominio predeterminado.
import { ManagementClient, CustomDomainHeader } from "auth0";// Dominio personalizado global (enviado en todas las solicitudes en lista blanca)const management = new ManagementClient({ domain: 'tenant.auth0.com', clientId: 'YOUR_M2M_CLIENT_ID', clientSecret: 'YOUR_M2M_CLIENT_SECRET', withCustomDomainHeader: 'login.example.com', });// Listar usuarios (endpoint en lista blanca - el encabezado se envía automáticamente)const users = await management.users.getAll();// Anulación por solicitud (tiene precedencia sobre la configuración global)const reqOptions = { ...CustomDomainHeader("specific-user-request.exampleco.com"),};const response = await management.users.getAll({}, reqOptions);
from auth0.management import ManagementClient, CustomDomainHeader# Dominio personalizado global (enviado en todas las solicitudes de la lista blanca)client = ManagementClient( domain='tenant.auth0.com', client_id='YOUR_M2M_CLIENT_ID', client_secret='YOUR_M2M_CLIENT_SECRET', custom_domain='login.example.com',)# Listar usuarios (endpoint en lista blanca - el encabezado se envía automáticamente)users = client.users.list()# Anulación por solicitud (tiene precedencia sobre el 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")// Nivel de cliente: aplica automáticamente el encabezado de dominio personalizado a los endpoints en lista blancamgmt, err := management.New( "{yourDomain}", option.WithClientCredentials("{yourClientId}", "{yourClientSecret}"), option.WithCustomDomainHeader("login.example.com"),)if err != nil { // Gestionar error}// Listar usuarios (endpoint en lista blanca - el encabezado se envía automáticamente)userList, err := mgmt.Users.List(context.Background(), nil)// Anulación por solicitud (tiene prioridad sobre el nivel de cliente)userList, err := mgmt.Users.List( context.Background(), nil, option.WithCustomDomainHeader("specific-request.exampleco.com"),)