[17.0.0.3 and later]

Configuración de la señal web JSON de MicroProfile

Puede configurar un servidor Liberty para que acepte una señal web JSON de MicroProfile como una señal de autenticación.

Antes de empezar

Instale Java™ Platform, edición Standard (Java SE) 8 o superior para utilizar la característica mpJwt-1.0.

Acerca de esta tarea

MicroProfile 1.2 define un estándar de señal web JSON interoperable (MP-JWT) que incluye tres partes:
  • El formato y la reclamación de la señal
  • La interfaz org.eclipse.microprofile.jwt.JsonWebToken, una ampliación de la interfaz java.security.Principal que pone este conjunto de reclamaciones a disposición a través de accesores de estilo get.
  • Correlación de la señal web JSON y las reclamaciones con distintas interfaces de programación de aplicaciones (API) de contenedor Java EE.

Busque la especificación de MP-JWT y la API en JWT RBAC para MicroProfile.

Cualquier parte de confianza en posesión de la señal MP-JWT puede utilizar dicha señal para acceder a los recursos asociados en Liberty enviando la señal a través de la cabecera de autorización. El formato de conexión de la señal debe seguir la especificación RFC 6750, La infraestructura de la autorización OAuth 2.0: Uso de la señal portadora, tal como se muestra en el ejemplo siguiente:

GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Bearer <MP-JWT token>
El servidor de recursos Liberty valida la señal MP-JWT, crea la señal web JSON autenticada y hace que la señal web JSON y las reclamaciones de señal estén disponibles a través de la inyección CDI o el contexto de seguridad JAX-RS. Para que se acepte como una señal MP-JWT, la señal JWT debe contener una lista de reclamaciones. El ejemplo siguiente muestra una señal MP-JWT token:
{
    "typ": "JWT",
    "alg": "RS256",
    "kid": "abc-1234567890"
}
{
       "iss": "https://server.example.com",
       "aud": "s6BhdRkqt3",
       "jti": "a-123",
       "exp": 1311281970,
       "iat": 1311280970,
       "sub": "24400320",
       "upn": "jdoe@server.example.com",
       "groups": ["red-group", "green-group", "admin-group", "admin"],
}

Procedimiento

  1. Añada la característica mpJwt-1.0 y cualquier otra característica necesaria al archivo server.xml. Como mínimo, la característica mpJwt-1.0 requiere las características AppSecurity-2.0 y jaxrs-2.0 y se utiliza, con frecuencia, con la característica CDI (Inyección de contextos y dependencias).
    <featureManager>
        <feature>mpJwt-1.0</feature>
        <feature>appSecurity-2.0</feature>
        <feature>jaxrs-2.0</feature>
        <feature>cdi-1.2</feature>
        ...
    </featureManager>
  2. Configure el elemento mpJwt.
    1. Añada el atributo issuer. Especifique un valor para este atributo que coincida con la reclamación iss en la señal web Java (JWT).
    2. Añada el atributo audiences si la JWT contiene una reclamación aud. Especifique un valor para este atributo que contiene un valor de la reclamación aud en la JWT.
    3. Añada el atributo jwksUri. Especifique un valor para este atributo que coincida con el URL de la clave web JSON (JWK). El código siguiente muestra un elemento de configuración mpJwt típico con JWK:
      <mpJwt 
           id="myMpJwt"
           jwksUri="https://example.com/api/jwk"
           issuer="https://example.com/api/v1"
           audiences="conferenceService">
      </mpJwt>
    4. Añada el atributo keyName si añade la clave de validación de firma JWT en el archivo truststore en la configuración de SSL (Secure Sockets Layer). El atributo keyName especifica el alias de clave en el archivo truststore. El código siguiente muestra una configuración de muestra mpJwt:
      <mpJwt 
           keyName="mpJwtValidationKey"
           issuer="https://example.com/api/v1"
           audiences ="conferenceService">
      </mpJwt>
  3. Configure un archivo truststore para incluir el certificado de punto final JWK, de forma que el servidor Liberty puede realizar conexiones SSL al punto final JWK.
    1. Configure truststores en elementos keystore en el archivo server.xml.
    2. Configure el SSL para hacer referencia a este archivo truststore.
    3. Establezca la configuración SSL como la configuración SSL predeterminada del servidor o especifique el ID de truststore en el atributo sslRef del elemento mpJwt.
    4. Si el emisor de JWT no soporta la JWK, y JWT se ha firmado con un certificado X.509, importe el certificado X.509 del emisor en el archivo truststore en una configuración de SSL. Si desea más información, consulte Habilitación de la comunicación SSL en Liberty.
  4. Opcional: Defina reglas para correlacionar reclamaciones de JWT con sujetos de autenticación para una JWT que no tenga formato de MP-JWT. De forma predeterminada, el programa utiliza la reclamación upn como el nombre principal y nombre de seguridad exclusivo del usuario y el programa utiliza la reclamación de grupos como el nombre de grupo para la correlación de roles de seguridad. Para cambiar la correlación predeterminada, utilice el atributo userNameAttribute para elegir una reclamación para el principal de usuario y utilice el atributo groupAttribute para elegir una reclamación para el nombre de grupo.
  5. Opcional: Utilice la aplicación JAX-RS para acceder al método getter JsonWebToken llamando a la API, javax.ws.rs.core.SecurityContext.getUserPrincipal(). En el ejemplo siguiente, el principal de usuario se distribuye como una instancia de la API org.eclipse.microprofile.jwt.JsonWebToken, y la aplicación puede acceder a todas la reclamaciones a través de los métodos getter JsonWebToken:
    @GET
    @Path("/getGroups")
    public Set<String> getGroups(@Context SecurityContext sec) {
           Set<String> groups = null;
           Principal user = sec.getUserPrincipal();
           if (user instanceof JsonWebToken) {
                    JsonWebToken jwt = (JsonWebToken) user;
                    groups= = jwt.getGroups();
           }
           return groups;
    }
  6. Opcional: Utilice una aplicación JAX-RS para inyectar la API org.eclipse.microprofile.jwt.JsonWebToken a través de los tipos Raw Type, ClaimValue, javax.inject.Provider y JSON-P, tal como se muestra en el ejemplo siguiente:
    @RequestScoped
    public class JwtEndpoint {
           @Inject
           private JsonWebToken jwtPrincipal;
           @GET
           @Path("/getInjectedPrincipal")
           public String getInjectedJWT() {
              return  this.jwtPrincipal.getName();
           }
    }
  7. Opcional: Si el programa realiza la seguridad programática, y puede obtener una API org.eclipse.microprofile.jwt.JsonWebToken del sujeto, utilice la API com.ibm.websphere.security.auth.WSSubject.getCallerPrincipal(). En el contexto de seguridad actual, el sujeto contiene dos principales java.security.Principal. Un principal es la señal web JSON.
  8. Opcional: [17.0.0.4 and later]Proteja recursos JAX-RS con anotaciones y las reclamaciones de grupo de JWT. Correlacione los nombres de rol de seguridad que se utilizan en la anotación @RolesAllowed con los nombres de grupo en la reclamación de grupos de la JWT. Si el nombre de rol y los nombres de grupo son iguales, puede omitir la correlación de rol en el elemento application-bnd. Sin embargo, si la JWT es una MP-JWT que contiene información de grupo, correlacione el elemento application-bnd para declarar la asociación de rol a grupo. Para obtener más información, consulte Protección de recursos JAX-RS utilizando anotaciones, ID de acceso y autorización y Autorización para aplicaciones cuando no se proporciona un enlace de correlación de roles.
  9. Opcional: [17.0.0.4 and later]Configure Liberty para comprobar el nombre principal de usuario de JWT contra el registro de usuarios de Liberty configurado.

    De forma predeterminada, el programa crea un sujeto de seguridad a partir del JWT verificado directamente sin necesidad del registro de usuarios. Para cambiar este comportamiento, se añade el atributo de configuración mapToUserRegistry="true" al archivo server.xml. El programa busca el nombre principal en el registro de usuarios configurado y crea un sujeto de seguridad a partir de los atributos de usuario del registro de usuarios.

  10. Opcional: [17.0.0.4 and later]Configure Liberty para aplicar la característica mpJwt-1.0 solo a las aplicaciones que tengan un nombre de método de inicio de sesión de MP-JWT.
    De forma predeterminada, si la característica mpJwt-1.0 está configurada, todas las solicitudes de autorización son necesarias para incluir un JWT válido en la cabecera HTTP. Para modificar el comportamiento predeterminado para exigir la señal de autenticación JWT sólo en algunas aplicaciones, añada el atributo de configuración ignoreApplicationAuthMethod="false" al elemento <mpJwt> en el archivo server.xml. A continuación, configure la aplicación de una de las dos maneras siguientes:
    • La aplicación tiene una anotación @LoginConfig con el método de inicio de sesión MP-JWT declarado como método de autenticación.

      Por ejemplo, @LoginConfig(authMethod = "MP-JWT", realmName = "MP-JWT").

    • El archivo web.xml de la aplicación tiene una declaración del método de autenticación MP-JWT en el elemento login-config.

      Por ejemplo, <login-config> <auth-method>MP-JWT</auth-method> <realm-name>MP-JWT</realm-name></login-config>.

  11. Opcional: [17.0.0.4 and later]Configure Liberty para que propague de forma automática MP-JWT como un token de autenticación cuando Liberty invoque otros servicios JAX-RS.

    Si Liberty también está actuando como un cliente JAX-RS 2.0, añada la sentencia authnToken="mpjwt" al elemento de configuración <webTarget>. El cliente JAX-RS de Liberty añade luego de forma automática JWT como una cabecera de autorización en la llamada al servicio JAX-RS. Por ejemplo, si se añade el elemento <webTarget uri="http://localhost:56789/protectedResourceWithMPJWT*" authnToken="mpjwt" /> al archivo server.xml, el token JWT se añade a la cabecera de autorización cuando se invoca el servicio http://localhost:56789/protectedResourceWithMPJWT/.


Icono que indica el tipo de tema Tema de tarea

Nombre de archivo: twlp_sec_json.html