Saltar al contenido principal

Usa IA para integrar Auth0

Si usas un asistente de programación con IA como Claude Code, Cursor o GitHub Copilot, puedes añadir la autenticación de Auth0 automáticamente en minutos con agent skills.Instala:
npx skills add auth0/agent-skills --skill auth0-quickstart --skill auth0-java-mvc-common
Luego pídele a tu asistente de IA:
Add Auth0 authentication to my Java EE app
Tu asistente de IA creará automáticamente tu aplicación de Auth0, obtendrá las credenciales, añadirá la dependencia del SDK Auth0 Java MVC Commons, configurará la autenticación con la API de seguridad de Java EE 8 e implementará los flujos de inicio y cierre de sesión. Documentación completa de agent skills →
Requisitos previos:

Primeros pasos

Auth0 le permite añadir rápidamente autenticación a su aplicación y acceder a la información del perfil de usuario. Esta guía muestra cómo integrar Auth0 con cualquier aplicación Java EE, nueva o existente, mediante el SDK auth0-java-mvc-common y la API de seguridad de Java EE 8.
1

Crea un proyecto nuevo

Genere un nuevo proyecto WAR de Maven:
mvn archetype:generate \
  -DgroupId=com.auth0.example \
  -DartifactId=java-ee-auth0-app \
  -DarchetypeArtifactId=maven-archetype-webapp \
  -DinteractiveMode=false
Ve al directorio del proyecto:
cd java-ee-auth0-app
Cree los directorios fuente de Java:
mkdir -p src/main/java/com/auth0/example/security
mkdir -p src/main/java/com/auth0/example/web
mkdir -p src/main/webapp/WEB-INF/jsp
2

Instala el SDK de Auth0

Reemplace el contenido de su pom.xml por lo siguiente:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.auth0.example</groupId>
    <artifactId>java-ee-auth0-app</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <version.wildfly>23.0.2.Final</version.wildfly>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>mvc-auth-commons</artifactId>
            <version>[1.0, 2.0)</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>8.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.security.enterprise</groupId>
            <artifactId>javax.security.enterprise-api</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.16.0</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>java-ee-auth0-app</finalName>
        <plugins>
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>4.2.0.Final</version>
                <configuration>
                    <version>${version.wildfly}</version>
                    <javaOpts>
                        <javaOpt>-Djboss.http.port=8080</javaOpt>
                    </javaOpts>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
Las dependencias javaee-api y javax.security.enterprise-api son provided porque el servidor de aplicaciones Java EE 8 aporta sus implementaciones en tiempo de ejecución.
3

Configura tu aplicación de Auth0

  1. Ve al Auth0 Dashboard y ve a Applications > Applications > Create Application.
  2. Introduce un nombre para tu aplicación (por ejemplo, “My Java EE App”).
  3. Selecciona Regular Web Applications como tipo de aplicación.
  4. Haz clic en Create.
  5. Abre la pestaña Settings.
  6. Toma nota de los valores de Domain, Client ID y Client Secret.
  7. Desplázate hacia abajo hasta Application URIs y configura:
    • Allowed Callback URLs: http://localhost:8080/callback
    • Allowed Logout URLs: http://localhost:8080/
  8. Haz clic en Save Changes.
Asegúrate de configurar las conexiones de tu aplicación para que los usuarios puedan iniciar sesión con el proveedor de identidad que prefieran.
4

Configura la autenticación

Actualiza tu web.xml para almacenar la configuración de Auth0 como entradas de entorno JNDI. Reemplaza los valores de marcador de posición con el dominio, el ID de cliente y el Secreto del cliente de la configuración de la aplicación de Auth0. Crea un jboss-web.xml para configurar el dominio de seguridad JASPIC requerido por la API de seguridad de Java EE 8, un bean CDI Auth0AuthenticationConfig.java para leer la configuración desde JNDI, y un productor CDI Auth0AuthenticationProvider.java para construir el AuthenticationController.
No incluyas https:// en el valor de auth0.domain. Usa solo el dominio y la región. Por ejemplo: dev-abc123.us.auth0.com.
5

Implementar la seguridad de Java EE

La API de seguridad de Java EE 8 usa HttpAuthenticationMechanism para gestionar la autenticación. Debe proporcionar implementaciones personalizadas de varias interfaces de seguridad. La anotación @AutoApplySession permite que el contenedor cree una sesión para el usuario autenticado, de modo que siga conectado entre solicitudes.
6

Añada la funcionalidad para iniciar y cerrar sesión

Crea los servlets para login, callback y logout. LoginServlet construye la URL de autorización de Auth0 y redirige al usuario. CallbackServlet gestiona la redirección después de la autenticación: Auth0AuthenticationMechanism intercepta primero esta solicitud para intercambiar el código de autorización por tokens, por lo que el servlet solo tiene que redirigir. LogoutServlet invalida la sesión y redirige al endpoint de logout de Auth0.
7

Crear la interfaz de usuario

Crea los servlets y las páginas JSP para las vistas de inicio y perfil. El HomeServlet verifica si existe un principal autenticado y establece los claims del perfil en la solicitud. El ProfileServlet muestra el perfil del usuario y los claims JWT, o redirige al Login si no está autenticado.
8

Ejecute la aplicación

Compile y ejecute la aplicación con el plugin de Maven de WildFly:
mvn clean wildfly:run
La aplicación debería iniciarse y mostrar la URL en la que escucha:
INFO  [org.jboss.as] WFLYSRV0025: WildFly started
Abre http://localhost:8080 en tu navegador. Haz clic en el enlace Login de la barra de navegación. Se te redirigirá a la página de inicio de sesión de Auth0. Después de autenticarte, se te redirigirá a la página de perfil, donde se muestran la información de tu usuario y los claims del JWT.
El ejemplo usa JSP y se ha probado con el servidor de aplicaciones WildFly. Es posible que debas ajustar algunos pasos si usas un contenedor compatible con Java EE 8 diferente.
Punto de controlAhora debería tener una aplicación Java EE protegida con Auth0 totalmente funcional en ejecución en http://localhost:8080. Los usuarios pueden iniciar sesión, ver su perfil y cerrar sesión.

Uso avanzado

Auth0JwtPrincipal está disponible mediante request.getUserPrincipal() en cualquier servlet. ProfileServlet muestra cómo acceder a los claims decodificados del ID token:
Principal principal = request.getUserPrincipal();

if (principal instanceof Auth0JwtPrincipal) {
    Auth0JwtPrincipal auth0JwtPrincipal = (Auth0JwtPrincipal) principal;
    DecodedJWT idToken = auth0JwtPrincipal.getIdToken();

    String name = idToken.getClaim("name").asString();
    String email = idToken.getClaim("email").asString();
    String picture = idToken.getClaim("picture").asString();
    String sub = idToken.getSubject();
}
Claims comunes disponibles en el ID token:
  • name — nombre para mostrar completo del usuario
  • email — dirección de correo electrónico del usuario
  • picture — URL de la foto de perfil del usuario
  • sub — identificador único del usuario (ID de usuario de Auth0)
Agregue parámetros personalizados a la URL de autorización al generarla en su LoginServlet:
src/main/java/com/auth0/example/web/LoginServlet.java
String authURL = authenticationController
        .buildAuthorizeUrl(request, response, callbackUrl)
        .withScope(config.getScope())
        .withAudience("https://your-api.example.com")
        .withParameter("screen_hint", "signup")
        .withParameter("ui_locales", "fr")
        .build();
Use .withAudience() para solicitar un token de acceso para una API específica. Use .withParameter() para cualquier parámetro de autorización adicional admitido por Auth0.
Para acceder a los tokens sin modificar para llamadas a API, modifique Auth0AuthenticationMechanism para almacenar los tokens en la sesión:
src/main/java/com/auth0/example/security/Auth0AuthenticationMechanism.java
if (isCallbackRequest(httpServletRequest)) {
    try {
        Tokens tokens = authenticationController.handle(
                httpServletRequest, httpServletResponse);

        httpServletRequest.getSession().setAttribute(
                "accessToken", tokens.getAccessToken());

        Auth0JwtCredential auth0JwtCredential =
                new Auth0JwtCredential(tokens.getIdToken());
        CredentialValidationResult result =
                identityStoreHandler.validate(auth0JwtCredential);
        return httpMessageContext.notifyContainerAboutLogin(result);
    } catch (IdentityVerificationException e) {
        return httpMessageContext.responseUnauthorized();
    }
}
Luego, recupere el token de acceso al llamar a una API protegida:
String accessToken = (String) request.getSession().getAttribute("accessToken");
URL url = new URL("https://your-api.example.com/data");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Authorization", "Bearer " + accessToken);
Configure AuthenticationController con un ID o nombre de organización para restringir el Login a una Organización de Auth0 específica:
src/main/java/com/auth0/example/security/Auth0AuthenticationProvider.java
@Produces
public AuthenticationController authenticationController(Auth0AuthenticationConfig config) {
    JwkProvider jwkProvider = new JwkProviderBuilder(config.getDomain()).build();
    return AuthenticationController.newBuilder(
                    config.getDomain(), config.getClientId(), config.getClientSecret())
            .withJwkProvider(jwkProvider)
            .withOrganization("org_YOUR_ORG_ID")
            .build();
}
El SDK valida automáticamente el claim org_id o org_name en el ID token para garantizar que coincida con la organización configurada.

Recursos adicionales

Auth0 Java MVC SDK

Código fuente y seguimiento de problemas

Referencia de la API (JavaDoc)

Documentación detallada de la API

Foro de la comunidad

Obtén ayuda de la comunidad de Auth0

Aplicación de ejemplo de Java EE

Aplicación de ejemplo completa en GitHub

Problemas comunes

Si recibes un error a0.invalid_state después del Login, significa que no se encontró la cookie de estado o que no coincide con el estado devuelto por Auth0.Verifica que:
  • La URL de devolución de llamada en el Auth0 Dashboard coincida exactamente con la URL que construye tu aplicación, incluido el número de puerto y el protocolo.
  • Tu navegador no esté bloqueando cookies de terceros.
  • Ningún proxy inverso ni middleware esté eliminando los encabezados Set-Cookie de las respuestas.
Asegúrate de usar la versión de tres argumentos de buildAuthorizeUrl y handle, que utiliza almacenamiento de estado basado en cookies:
// Correcto — usa cookies para el estado
authenticationController.buildAuthorizeUrl(request, response, callbackUrl)
authenticationController.handle(httpServletRequest, httpServletResponse)
Si ves errores de inyección o mensajes de que no se encuentran beans, asegúrate de que:
  • Tu servidor de aplicaciones sea compatible con CDI 2.0 (parte de Java EE 8)
  • Todas las clases de seguridad (Auth0AuthenticationConfig, Auth0AuthenticationProvider, Auth0JwtIdentityStore, Auth0AuthenticationMechanism) estén anotadas con @ApplicationScoped
  • Exista src/main/webapp/WEB-INF/jboss-web.xml con el dominio de seguridad jaspitest configurado
src/main/webapp/WEB-INF/jboss-web.xml
<jboss-web>
    <security-domain>jaspitest</security-domain>
    <context-root>/</context-root>
</jboss-web>
El dominio de seguridad jaspitest es necesario para que WildFly habilite la integración con JASPIC (Java Authentication SPI for Containers), de la que depende la API de seguridad de Java EE 8.
Este inicio rápido usa el espacio de nombres javax (Java EE 8). Si usas un servidor que ya migró al espacio de nombres jakarta (Jakarta EE 9+), como WildFly 27+ o Payara 6+, el código no se compilará ni se ejecutará.Usa un servidor compatible con Java EE 8:
  • WildFly 14 a 26
  • Payara 5
  • GlassFish 5
  • Open Liberty con características de Java EE 8

Aplicación de ejemplo

En GitHub hay disponible una aplicación de ejemplo de Java EE integrada con Auth0:

Aplicación de ejemplo de Java EE

Incluye Login, cierre de sesión, perfil de usuario y otros ejemplos.
Clónela y ejecútela:
git clone https://github.com/auth0-samples/auth0-java-ee-sample.git
cd auth0-java-ee-sample/01-Login
Actualiza los valores de configuración de Auth0 en src/main/webapp/WEB-INF/web.xml y, a continuación, ejecuta:
./mvnw clean wildfly:run
Ve a http://localhost:8080 en tu navegador y haz clic en Login para probarlo.