Configuración de la autenticación de JSON Web Token para OpenID Connect

Puede configurar un servidor Liberty para aceptar una señal JWT (JSON Web Token) como una señal de autenticación de un proxy de autenticación de confianza, un cliente de servicio de confianza o un servidor de autorización OAuth.

Acerca de esta tarea

Open Liberty La documentación para la autenticación de JSON Web Token para OpenID Connect se puede encontrar en el sitio web de Open Liberty.

Para configurar un servidor Liberty para aceptar una señal JWT como señal de autenticación, habilite la característica openidConnectClient-1.0 , establezca inboundPropagation="required"y configure un almacén de confianza y SSL. Opcionalmente puede especificar configuración adicional de JWT como, por ejemplo, registros de usuarios, filtros de autenticación y correlación de reclamación y sujeto. La configuración para utilizar JWT como señal de autenticación es similar a Configuración de un cliente de OpenID Connect en Liberty.

Cualquier parte de confianza en posesión de una señal JWT puede utilizar dicha señal para obtener acceso a los recursos asociados en Liberty. El servidor de recursos Liberty valida la señal JWT y crea el sujeto autenticado a partir de la señal JWT. Para que se acepte como una señal de autenticación, la señal JWT debe contener reclamaciones iss, sub y exp, y firmarse con el algoritmo RS256 o HS256. En la versión 21.0.0.12 y anterior, no se da soporte a JWT cifrado.

En la versión 22.0.0.1 y posterior, se da soporte a JWT cifrado. Para obtener más información, consulte el sitio web de Open Liberty

En el ejemplo siguiente se muestra una carga útil de JWT descodificada:
{
	"iss":"https://idp.acme.com:8020/jwt",
	"sub":"marissa@acme.com",
	"exp":1385066178,
	"aud":"https://resource.acme.com/services",
	"iat":1385062578,
	"groupIds": [
	    "group1", "group2"
	 ]
}

Procedimiento

  1. Añada la característica openidConnectClient-1.0 Liberty y cualquier otra característica necesaria al archivo server.xml . Como mínimo, la característica openidConnectClient-1.0 requiere la característica transportSecurity-1.0. Añada la siguiente declaración de elemento dentro del elemento featureManager en el archivo server.xml :
    <feature>openidConnectClient-1.0</feature>
    <feature>transportSecurity-1.0</feature>
  2. Configure un elemento openidConnectClient y establezca inboundPropagation="required". Para obtener información sobre otros atributos de openidConnectClient , consulte OpenID Connect Client.

    En el ejemplo siguiente se presupone que el emisor de señal JWT admite JWK (JSON Web Key) y que se firma con el algoritmo RS256.

    <openidConnectClient id="RS" inboundPropagation="required"
      jwkEndpointUrl="https://acme.com/jwtserver/jwk" signatureAlgorithm="RS256"
      issuerIdentifier="https://idp.acme.com:8020/jwt" >
    </openidConnectClient>
  3. Configure un almacén de confianza para incluir el certificado de punto final JWK para que el servidor Liberty pueda realizar conexiones SSL con el punto final JWK. Los almacenes de confianza se configuran en elementos keyStore en el archivo server.xml .
    Después de configurar SSL para hacer referencia a este almacén de confianza, debe establecer la configuración SSL predeterminada del servidor o especificar el ID en el atributo sslRef del elemento openidConnectClient.

    Si el emisor de JWT no admite JWK y la señal JWT se firma en su lugar con un certificado X.509, importe el certificado X.509 del emisor en el almacén de confianza. En el elemento openidConnectClient, especifique el ID de almacén de confianza en el atributo trustStoreRef y haga referencia al certificado en el atributo trustAliasName.

    Si la señal JWT se firma utilizando una clave secreta compartida con el algoritmo HMAC-SHA256, defina la clave secreta compartida en el atributo clientSecret.

    Para obtener información sobre almacenes de confianza o almacenes de claves, consulte Habilitación de la comunicación SSL en Liberty.

  4. Configure el atributo issuerIdentifier del elemento openidConnectClient para que coincida con la reclamación iss del emisor de JWT.

    Por ejemplo, si la señal JWT contiene "iss":"https://idp.acme.com:8020/jwt", establezca issuerIdentifier="https://idp.acme.com:8020/jwt".

  5. Opcional: Configure un registro de usuarios.
    De forma predeterminada, las reclamaciones de JWT verificadas se utilizan para crear el sujeto autenticado del emisor, sin correlacionar la JWT con un usuario, de modo que no se requiere ningún registro de usuarios.

    Sin embargo, si el atributo mapIdentityToRegistryUser del elemento openidConnectClient se establece en true, debe devolverse una entrada de usuario para la identidad apropiada desde el servidor de autorización para que la autenticación y la autorización sean satisfactorias. Para obtener más información sobre cómo configurar un registro de usuarios, consulte Configuración de un registro de usuarios en Liberty.

  6. Opcional: Configure los filtros de autenticación tal como se describe en Filtros de autenticación.

    Si configura un filtro de autenticación, haga referencia al filtro de autenticación en el atributo authFilterRef del elemento openidConnectClient.

    Si el elemento openidConnectClient no se configura con un atributo authFilterRef, cualquier intento de solicitud no autenticada se autentica mediante este elemento openidConnectClient.

  7. Opcional: Configure el servidor de recursos Liberty para que funcione con varios emisores JWT o servidores proxy de autenticación configurando varios elementos openidConnectClient y varios filtros de autenticación.

    Cada elemento openidConnectClient define una relación de confianza con un emisor de JWT o proxy de autenticación y hace referencia a un filtro de autenticación.

  8. Opcional: Defina reglas para correlacionar reclamaciones JWT con sujetos de autenticación.
    El servidor de recursos Liberty utiliza reclamaciones JWT para crear sujetos de autenticación y puede definir cómo correlacionar reclamaciones JWT con el sujeto en los siguientes atributos de elemento openidConnectClient :
    • userIdentifier
    • userUniqueIdentifier
    • groupIdentifier
    • realmName
    • realmIdentifier
    Si se configura realmName y realmIdentifier, realmName tiene prioridad y realmIdentifier se ignora.
    Si no se define ninguna correlación de reclamación y sujeto, se aplican las siguientes reglas de correlación predeterminadas:
    • La reclamación de sujeto (sub) se utiliza como nombre principal y nombre de seguridad exclusivo del usuario.
    • La reclamación de emisor (iss) es el reino predeterminado y se utiliza como reino de sujeto. Si se incluye una reclamación realmName en la señal JWT, se utiliza la reclamación realmName como reino de sujeto en lugar de la reclamación iss.
  9. Opcional: Configure una cookie de inicio de sesión único.
    El servidor de Liberty espera que cada solicitud proporcione una señal JWT válida y no crea ni utiliza cookies de inicio de sesión único para la autenticación. Para crear cookies de inicio de sesión único, establezca authnSessionDisabled="false" en el elemento openidConnectClient.
  10. Opcional: Configure el servidor Liberty para recibir señales JWT. El cliente web puede utilizar uno de los métodos siguientes para enviar señales JWT en solicitudes de recursos al servidor de recursos Liberty . Si la señal JWT se envía en el campo Authorization o en un parámetro de cuerpo codificado con formato, no es necesaria ninguna configuración de servidor adicional.
    Importante: Los clientes no deben utilizar más de un método en cada solicitud para transmitir la señal. Si se ha configurado el atributo headerName, las señales enviadas en el campo de cabecera Authorization o en un parámetro de cuerpo de formulario codificado se ignoran. Si el atributo headerName no está configurado, se buscar primero en la cabecera Authorization, seguido del parámetro access_token.
    • Enviar la señal en el campo de cabecera de solicitud Authorization.
      GET /resource HTTP/1.1
      Host: server.example.com
      Authorization: Bearer mF_9.B5f-4.1JqM
      
    • Enviar la señal en el cuerpo de entidad de solicitud como un parámetro de cuerpo de formulario codificado.
      POST /resource HTTP/1.1
      Host: server.example.com
      Content-Type: application/x-www-form-urlencoded
      access_token=mF_9.B5f-4.1JqM
      
    • Envíe la señal en un campo de cabecera de solicitud personalizada configurando un nombre de cabecera de confianza en Liberty.

      Para configurar el nombre de cabecera de confianza, establezca headerName="<myJwtHeaderName>" en el elemento openidConnectClient. Por ejemplo, si establece headerName="jwt", puede enviar la señal en el campo de cabecera jwt tal como se muestra en el ejemplo siguiente:
      GET /resource HTTP/1.1
      Host: server.example.com
      jwt: mF_9.B5f-4.1JqM
  11. Configure las audiencias de JWT.
    Para definir una lista de audiencias de confianza, configure el atributo audiences en el elemento openidConnectClient.
    Una señal JWT válida debe cumplir una de las condiciones siguientes:
    • Si se ha configurado el atributo audiences, el valor de reclamación de audiencia (aud) debe ser una de las audiencias configuradas. Para ignorar la comprobación de audiencias, establezca audiences en ALL_AUDIENCES.
    • Si no se ha configurado el atributo audiences, pero la señal JWT contiene una reclamación aud que es un URL válido, el URL de servicio de recursos debe tener el valor aud como prefijo.
      Por ejemplo, la audiencia siguiente es válida porque el URL de recursos empieza con el valor de reclamación aud:
      • Reclamación de audiencia: "aud":"https://<server>:<port>/something"
      • Recurso URL : https://<server>:<port>/something/specific
      La audiencia siguiente no es válida porque el URL de recursos no empieza con el valor de reclamación aud.
      • Reclamación de audiencia: "aud":"https://<server>:<port>/something/specific"
      • Recurso URL : https://<server>:<port>/something
  12. Opcional: Correlacione mediante programación señales JWT con sujetos implementando la interfaz de programación de servicios (SPI) de com.ibm.wsspi.security.oauth.UserCredentialResolver .

    Para obtener información sobre la interfaz, consulte la información de com.ibm.wsspi.security.oauth.UserCredentialResolver SPI en Interfaces de programación o en la documentación de Java que se proporciona con el producto en el directorio ${wlp.install.dir}/dev/spi/ibm/ .

Resultados

Ha creado la configuración mínima necesaria para configurar un servidor Liberty para aceptar señales JWT como señales de autenticación.