SSO mediante LTPA en servidores IBM WebSphere (Parte 2)

/ / Arquitectura, Blog, DevOps
ltpa-sso-websphere-1
Jornada para estudiantes: "Desarrollando software para Alfresco" en la Universidad de Zaragoza
keensoft en el Alfresco Day Barcelona 2016

En el primer artículo hablamos de la parte técnica de los Tokens LTPA, en esta segunda parte veremos el cómo crear y validar un token programáticamente.

Los tokens generados por el IBM WebSphere Portal se producen a partir de una identificación válida del usuario y se informan como una cookie en la sesión de este. Todo el proceso es trasparente al usuario y a las aplicaciones desplegadas en el portal, pero hay veces que es necesario adaptarlo a los requisitos propios de las aplicaciones que se están integrando.

En el caso de uso que nos fue requerido las aplicaciones tenían que poder autorizar las peticiones basándose únicamente en el hecho de estar desplegadas dentro del mismo servidor. Para ello podríamos haber gestionado tokens usando las bases criptográficas que se explicaron en el artículo anterior y las claves compartidas del servidor o utilizar los propios sistemas del IBM WebSphere Application Server. Evidentemente siempre es mejor utilizar los sistemas que facilita el servidor antes que reinventar la rueda.

 

Preparando el entorno

Puesto que vamos a usar las clases proporcionadas por el servidor, necesitaremos tener en classpath durante el desarrollo las librerías que este facilita para poder compilar nuestra aplicación. Estas librerías las encontraremos en el directorio de ‘runtimes’, que dependiendo de las instalación puede variar ligeramente su ruta. En nuestra instalación sobre Linux estos archivos se encontraban en el directorio /opt/IBM/WebSphere/AppServer/runtimes :

Librerías runtime de WebSphere

Librerías runtime de WebSphere

 

Generando tokens sin crendeciales

Vamos a generar tokens LTPA que tengan validez dentro del reino de servidores que compartan claves, pero sin la necesidad de una credencial válida para que no sea necesario configurar ningún dato de autenticación.

En primer lugar obtenemos del servidor el gestor de tokens LTPA:

 

        LTPAServerObject ltpaServer = LTPAServerObject.getLTPAServer();

 

Posteriormente necesitaremos obtener el reino del servidor, ya que es uno de los datos que se incluyen en el token:

 

        ORB orb = EJSORB.getORBInstance();
        String principalName = orb.getProperty("com.ibm.CORBA.principalName");
        String realm = principalName.substring(0, principalName.indexOf("/"));

 

Después compondremos una credencial usando todos los datos (el nombre que especificamos es libre y solo será un dato más del token):

 


        String securityName = "MyName";
        WSCredential credential = new WSCredentialImpl(realm, securityName, null);

 

Por ultimo solicitaremos al gestor de tokens un token válido a partir de esta credencial:

 


        WSCredential fullCredential = ltpaServer.createLTPAToken(credential);

 

y si queremos lo codificaremos en Base64 para poder informarlo en las peticiones de forma segura:

 


        String tokenBase64 = Base64.encode(fullCredential.getCredentialToken());

 

Validando tokens

Como hemos comentado al inicio, la validación que vamos a realizar de los tokens solo es a nivel criptográfico, ya que las credenciales utilizadas en su creación no tienen validez dentro del reino.

Igual que en el caso de la creación, el primer paso es obtener el gestor LTPA del servidor:

 


        LTPAServerObject ltpaServer = LTPAServerObject.getLTPAServer();

 

Posteriormente podemos validar el token y obtener los atributos de este:

 


        Token token = ltpaServer.validateToken(Base64.decode(tokenBase64));
        System.out.println("\tValid:" + token.isValid());
        System.out.println("\tExpiration: " + (new Date(token.getExpiration())));
        System.out.println("\tAtributes: ");
        Enumeration attributeNames = token.getAttributeNames();
        while (attributeNames.hasMoreElements()) {
                String key = (String) attributeNames.nextElement();
                System.out.println("\t\t" + key + " - " + Arrays.toString(token.getAttributes(key)));
        }

 

Por ejemplo, de un token generado con el código anterior obtenemos:

 

        Validando el token...
        Valid:true
        Expiration: Sun Feb 14 21:10:00 CET 2016
        Atributes:
                u - [MyName]

 

Conclusiones

En este artículo hemos visto como utilizar el sistema de tokens LTPA de forma programática y sin una credencial válida en el servidor, usando las clases que este facilita podemos adaptar el sistema a nuestros requisitos de forma sencilla sin necesidad de conocer las operaciones criptográficas que hay detrás.

 


Referencias

Lightweight Third Party Authentication – (http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/csec_ltpa.html?cp=SSAW57_8.5.5%2F1-8-1-32-2-2-0&lang=en)

Understanding LTPA – (ftp://public.dhe.ibm.com/software/integration/datapower/library/prod_docs/Misc/UnderstandingLTPA-v1.pdf)

Configuring LTPA and working with keys – (http://www-01.ibm.com/support/knowledgecenter/SSAW57_7.0.0/com.ibm.websphere.nd.doc/info/ae/ae/tsec_ltpa_and_keys.html?cp=SSAW57_7.0.0%2F1-3-0-0&lang=en)

Alfresco LTPA authenticator – (http://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/COMMUNITYTAGS/V4.0d/root/modules/quickr/source/java/org/alfresco/repo/lotus/ws/impl/auth/LtpaAuthenticator.java)