JAX RS Client Security y servicios REST

Vamos a ver un ejemplo de JAX RS Client Security. En el artículo anterior hemos protegido un recurso REST mediante autenticación básica . Es momento de conectarnos a él usando un cliente Java  .

El primer paso es configurar las dependencias que nuestra aplicación de consola necesita usando Maven:


<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/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.arquitecturajava</groupId>
 <artifactId>ClienteREST</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <dependencies>

 <dependency>
 <groupId>org.glassfish.jersey.core</groupId>
 <artifactId>jersey-client</artifactId>
 <version>2.25.1</version>
 </dependency>
 <dependency>
 <groupId>org.glassfish.jersey.media</groupId>
 <artifactId>jersey-media-json-jackson</artifactId>
 <version>2.25</version>
 </dependency>
 </dependencies>
</project>

Una vez hecho esto vamos a crear el programa que se encarga de conectarse al servicio REST. Este programa incluirá una clase de negocio y un cliente.

package com.arquitecturajava.bo;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="noticia")
public class Noticia {

 private String id;
 private String titulo;
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getTitulo() {
  return titulo;
 }
 public void setTitulo(String descripcion) {
  this.titulo = descripcion;
 }
}

package com.arquitecturajava.cliente;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;

import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;

import com.arquitecturajava.bo.Noticia;

public class Principal {

 public static void main(String[] args) {

  Client client = ClientBuilder.newClient();
  WebTarget target = client.target("http://localhost:8080/WebRESTSeguridad/noticias");

  GenericType<List<Noticia>> noticias = new GenericType<List<Noticia>>() {
  };

  List<Noticia> listaNoticia = target.request(MediaType.APPLICATION_JSON).get(noticias);

  for (Noticia n : listaNoticia) {

   System.out.println(n.getId());

   System.out.println(n.getTitulo());

  }
 }

}

En este caso estamos usando JAX RS y el API de cliente para acceder al servicio REST que creamos anteriormente . Ahora bien no estamos pasando ningún tipo de credencial. Por lo tanto el servicio nos devolverá una excepción de acceso no autorizado:

JAX RS Client Security

Para solventar este problema lo único que nos falta es modificar el cliente de JAX-RS y añadir la autenticación básica.

 HttpAuthenticationFeature autentificacion = HttpAuthenticationFeature.basic("cecilio", "cecilio");
 Client client = ClientBuilder.newClient();
 client.register(autentificacion);

Acabamos de registrar el tipo de Autenticación, ahora ya no tendremos problemas y accederemos al servicio sin errores:

Nos acabamos de conectar con JAX RS Client Security. Cada framework de JAX-RS utiliza su propio sistema de autenticación en la parte cliente ya que la especificación lo deja muy abierto. En este caso hemos abordado la autenticación más básica , la cual no incluye encriptación del canal.

Otros artículos relacionados:

 JAX-RS Client y Servicios REST

 El porqué de los MicroServicios 

Seguridad y JAAS