Repositorio de Liberty[8.5.5.4 o posterior]

JSON Web Token (JWT) for OAuth Client Authorization Grants

JWT for OAuth Client Authorization Grants permite que un cliente envíe una señal JWT firmada al proveedor de OpenID Connect a cambio de una señal de acceso OAuth 2.0.

JWT for OAuth Client Authorization Grants se incluye en la característica openidConnectServer-1.0. Permite que un cliente envíe una señal JWT firmada al proveedor de OpenID Connect a cambio de una señal de acceso OAuth 2.0.

Un caso de ejemplo de esta función puede ser un cliente de una compañía eléctrica que autoriza los pagos mensuales automáticos de un banco en línea. Se presupone que la compañía eléctrica y el banco en línea hayan establecido una relación de confianza con el fin de satisfacer tales solicitudes. La compañía eléctrica puede enviar una señal JWT firmada con las declaraciones adecuadas al URI de punto final de señal del proveedor de OpenID Connect configuradas para el banco en línea para solicitar una señal de acceso de OAuth 2.0 cada mes. A continuación, la compañía eléctrica puede utilizar la señal de acceso para ingresar los pagos mensuales en efectivo del banco en línea.

Partes de la especificación JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants están soportadas para servidores de perfiles Liberty configurados como proveedores de OpenID Connect. Los usuarios que deseen dar soporte a la funcionalidad de cliente JWT deben hacerlo utilizando su propia aplicación.

Ámbitos autorizados

El Cliente de OpenID Connect envía una petición HTTPS con una JWT al punto final de señal del proveedor de OpenID Connect para solicitar una señal de acceso. Durante este proceso, el usuario no visualiza ningún formulario de consentimiento para autorizar el uso de ámbitos. El manejador de JWT manejará los ámbitos autorizados en función de los siguientes criterios:

  1. Si no se especifica ningún parámetro de ámbito en la solicitud, el proveedor de OpenID Connect no especificará ningún ámbito en la señal de acceso.
  2. Cuando un cliente de OpenID Connect esté calificado como cliente autoAuthorized en la configuración de proveedor de OpenID Connect, cualquier ámbito especificado por el cliente en la solicitud se especificará en la lista de ámbitos de la señal de acceso.
  3. Cuando un cliente de OpenID Connect no esté calificado como cliente autoAuthorized, el ámbito que se incluye en la solicitud deberá filtrarse por la lista de ámbitos de la configuración del cliente y también deberá especificarse en la lista preAuthorizedScope. Si un ámbito de la solicitud HTTPS está en la lista scope y preAuthorizeScope de la configuración del cliente, el ámbito puede especificarse en la lista de ámbitos de la señal de acceso.

Cuando un cliente no está calificado como cliente autoAuthorized, los ámbitos que pueden incluirse en la lista de ámbitos de la señal de acceso deben configurarse correctamente en la configuración del cliente. El ámbito debe incluirse en los valores de los atributos scope y preAuthorizedScope de la configuración del cliente para el proveedor de OpenID Connect. En el ejemplo que se muestra, los ámbitos profile y email se especifican en la lista de ámbitos de la señal de acceso porque ambos están incluidos en la lista de valores de scope y preAuthorizedScope. Si un ámbito no aparece listado en el atributo scope de la configuración del cliente, se omite de la lista de ámbitos de la señal de acceso. Si un ámbito está listado en el atributo scope, pero no está incluido en la lista preAuthorizedScope de la configuración del cliente, la solicitud de autorización desencadena un error invalid_grant en la respuesta del proveedor de OpenID Connect.

<openidConnectProvider id="OidcConfigSample" oauthProviderRef="OAuthConfigSample" />
<oauthProvider id="OAuthConfigSample" ... >
        ...
        <localStore>
            <client name="client01" secret="{xor}..."
                    displayname="client01"
                    scope="profile email phone"
                    preAuthorizedScope="profile email"
                    enabled="true" />
            ...
        </localStore>
    </oauthProvider>

Declaraciones en una JSON Web Token

Una JSON Web Token válida debe estar firmada. Un servidor de perfiles Liberty configurado como proveedor de OpenID Connect sólo admite HMAC-SHA256 como algoritmo de firma de señal. La clave de firma de cada cliente de OpenID Connect es el atributo secret de la configuración del cliente del proveedor de OpenID Connect. En el ejemplo que se muestra, la clave de firma que se utiliza es "{xor}LDo8LTor".

<client name="client01" displayname="client01" secret="{xor}LDo8LTor" ... />

El proveedor de OpenID Connect también verifica las declaraciones siguientes en una JWT:

'iss' (emisor)
Esta declaración es obligatoria en una JWT. La declaración iss debe coincidir con el atributo name o con el atributo redirect de la configuración del cliente en el proveedor de OpenID Connect. En el ejemplo siguiente, la declaración iss debe coincidir con client01 o con http://op201406.ibm.com:8010/oauthclient/redirect.jsp.
<client name="client01" redirect="http://op201406.ibm.com:8010/oauthclient/redirect.jsp" scope="openid profile email" ... />
'sub' (sujeto)
Esta declaración es obligatoria en una JWT. El valor del sujeto debe ser un nombre de usuario válido en el registro de usuarios del servidor del proveedor de OpenID Connect.
'aud' (público)
Esta declaración es obligatoria en una JWT. El valor de la declaración de público es el nombre del issuerIdentifier cuando se especifica el atributo issuerIdentifier en la configuración de openidConnectProvider. Si el atributo issuerIdentifier no se especifica en la configuración de openidConnectProvider, el público debe ser el URI de punto final de señal del proveedor de OpenID Connect. En el ejemplo siguiente, el valor de la declaración de público es "OpenIDConnectProviderID1".
<openidConnectProvider id="OidcConfigSample" oauthProviderRef="OAuthConfigSample" issuerIdentifier="OpenIDConnectProviderID1" />
'exp' (caducidad)
Esta declaración es obligatoria en una JWT y limita el intervalo de tiempo durante el que la JWT puede utilizarse. El proveedor de OpenID Connect verifica exp con respecto al reloj del sistema, más algún desfase horario permitido.
'nbf' (no antes de)
Esta declaración es opcional. Si está presente, la señal sólo es válida después de la hora especificada por esta declaración. El proveedor de OpenID Connect verifica esta hora con respecto al reloj del sistema, más algún desfase horario permitido.
'iat' (emitida a las)
De forma predeterminada, es una declaración opcional. Sin embargo, si el atributo iatRequired del elemento jwtGrantType se establece en true, todas las JWT deben contener la declaración iat. Si está presente, la declaración iat indica la hora a la que se ha emitido la JWT. Una JWT no puede emitirse más allá del valor especificado por maxTokenLifetime.
'jti' (ID de JWT)
Esta declaración es opcional y es el identificador exclusivo de una señal JWT. Si está presente, un emisor no puede reutilizar el mismo ID de JWT. Por ejemplo, si client01 emite una JWT cuyo jti es id6098364921, ninguna otra JWT emitida por client01 puede tener un valor de jti id6098364921. Una JWT con una declaración jti idéntica a otra JWT se considera como un ataque de reproducción. Los servidores de perfiles Liberty configurados como proveedores de OpenID Connect configuran una caché de jti en el servidor. El tamaño de la memoria caché se especifica en el valor maxJtiCacheSize de la configuración de jwtGrantType. Los ID de jti que se guardan en la memoria caché se comprueban con respecto a cualquier nuevo ID de jti entrante. Los ID de jti almacenado en la memoria caché no se descartan a menos que la memoria caché esté llena.

Envío de solicitudes de JSON Web Token

Es aconsejable utilizar el protocolo HTTPS en lugar de HTTP para enviar una solicitud JWT. El punto final de señal del proveedor de OpenID Connect se utiliza para manejar solicitudes JWT HTTPS. Para determinar el punto final de señal para el proveedor de OpenID Connect, consulte Invocación del punto final de señal de OpenID Connect o URLs de punto final OAuth.

La solicitud debe contener los parámetros siguientes:

  • grant_type: el valor de este parámetro debe ser "urn:ietf:params:oauth:grant-type:jwt-bearer"
  • asertion: el valor de este parámetro debe contener una sola señal JWT firmada.
  • scope: este parámetro es opcional. Si se omite scope, la señal de acceso que se devuelve no contiene ningún ámbito. Los valores de ámbito listados en el parámetro scope se comprueban con respecto a la configuración del proveedor de OpenID Connect. Para obtener más información, consulte la sección anterior, Ámbitos autorizados.
  • client_id: el valor de este parámetro debe coincidir con el atributo name de la configuración del cliente del proveedor de OpenID Connect.
  • client_secret: el valor de este parámetro debe coincidir con el atributo secret de la configuración del cliente del proveedor de OpenID Connect.

Ejemplo de solicitud HTTPS:

POST /token.oauth2 HTTP/1.1
    Host: oidc.ibm.com
    Content-Type: application/x-www-form-utlencoded

    client_id=client01
    &client_secret=secret     
    &grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer     
    &assertion=eyJhbGc[---omitted---]kIn0.eyJpc[---ommitted---]A4fQ.MB6ZFlCsHg5MJ-weIHZYz6xgF1jdSZn7ErchHs8-8Rk     
    &scope=profile email

Ejemplo de Java para crear una señal JWT firmada:

package com.ibm.sample;

import java.security.SignatureException;
import com.google.gson.JsonObject;
import net.oauth.jsontoken.crypto.HmacSHA256Signer;

import net.oauth.jsontoken.SystemClock;
import net.oauth.jsontoken.JsonToken;
import org.joda.time.Duration;
import org.joda.time.Instant;

public class SampleJWTToken {
        private static final Duration SKEW = Duration.standardMinutes(5);

        JsonToken jwtToken = null;
        String[] allPayloadKeys = { "iss", "sub", "aud", "exp", // obligatorio
                                    "nbf", "iat", "jti" }; // opcional

        public SampleJWTToken(String clientId, 
                              String keyId,
                              String signKey,
                              String audience, 
                              String subject, // usuario
                              String jtiId) throws Exception { // InvalidKeyException

                byte[] hs256Key = signKey.getBytes();
                HmacSHA256Signer hmacSha256Signer = new HmacSHA256Signer(
                                clientId, keyId, hs256Key);
                // _rsaSha256Signer = new RsaSHA256Signer(clientId, _keyId,
                //                                        _privateKey);
                SystemClock clock = new SystemClock(SKEW);
                jwtToken = new JsonToken(hmacSha256Signer, clock);
                JsonObject headerObj = jwtToken.getHeader();
                JsonObject payloadObj = jwtToken.getPayloadAsJsonObject();

                headerObj.addProperty("alg", "HS256");

                Instant instantExp = clock.now().plus(600000); // 10 minutos
                jwtToken.setExpiration(instantExp);
                jwtToken.setAudience(audience);
                payloadObj.addProperty("iss", clientId);
                payloadObj.addProperty("sub", subject);

                // opcional
                payloadObj.addProperty("jti", jtiId);
                jwtToken.setIssuedAt(clock.now()); // emitida a la hora
        }

        public String getJWTTokenString() throws Exception {
                String signedAndSerializedString = null;
                try {
                        signedAndSerializedString = jwtToken.serializeAndSign();
                } catch (SignatureException e) {
                        throw e;
                }
                return signedAndSerializedString;
        }
}

Icono que indica el tipo de tema Tema de concepto

Términos y condiciones para centros de información | Comentarios


Icono de indicación de fecha y hora Última actualización: 15 de junio de 2015
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=cwlp_jwttoken
Nombre de archivo:cwlp_jwttoken.html