GeoBack. Un sencillo ejemplo. 2ª parte

En la primera parte de este post, vimos como hacer un sencillo Api para almacenar un Layer, el cual contiene datos georeferenciados en un GeoJSON, con GeoBack. En esta segunda parte de nuestro ejemplo , veremos como configurar la seguridad con Json Web Tokens.

Accesos seguros con JWT.

JWT es una sencilla y limpia manera de proteger los accesos a un Api. Se trata de un sistema compacto y portable, que auto-contiene toda la información necesaria. Para esta ocasión, hemos utilizado el ejemplo de este Pascal Alma (ejemplo de JWT), y en este Post tenéis muy bien explicado el concepto de Json Web Tokens, y cómo integrarlo con Spring Security (explicacion de JWT con Spring).

Lo más importante será ver cómo se crea el Token con el que vamos a autenticar nuestros requests. Gracias a este proceso de autenticación, se pueden restringir y contabilizar los accesos. Por poner un ejemplo, si estamos desarrollando una aplicación Android, tendremos que registrar el id del dispositivo (o una clave generada a partir del certificado con el que firmamos nuestra App, si esta está abierta al público) y de esta manera, cuando recibamos el request con el Token, podremos contabilizar el acceso desde ese dispositivo. Por supuesto, tendremos que integrar la gestión de estos accesos en nuestro sistema.

public class JwtAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
        // Do do anything specific here
        System.out.println(authentication.toString());
        
        // En este punto llamaríamos al servicio de conteo de accesos 
        // por token y registramos el acceso.

    }

}

Si nos fijamos en el código, en la clase JwtAuthenticationSuccessHandler.java, el método  onAuthenticationSucces se ejecuta en cada acceso a la Api, siempre y cuando el Token sea correcto. Es aquí donde tendríamos que hacer la gestión de accesos.

En la web de JWT se puede ver cómo se constituyen los Token, su estructura y cómo se generan. Como puede observarse en la sección de Libraries, existen implementaciones para los lenguajes de programación más importantes (por ejemplo, si tenemos una aplicación para iOS escrita en objective-c, añadimos al proyecto la librería correspondiente y generamos el Token con nuestra palabra secreta).

Generando el Token

En nuestro ejemplo, hemos utilizado la clase JwtTokenGenerator.java para generar un Token de ejemplo.

public static String generateToken(JwtUserDto u, String secret) {
    Claims claims = Jwts.claims().setSubject(u.getUsername());
    claims.put("userId", u.getId() + "");
    claims.put("role", u.getRole());

    return Jwts.builder()
            .setClaims(claims)
            .signWith(SignatureAlgorithm.HS512, secret)
            .compact();
}

El método generateToken genera el Token a partir de la clave secreta y los datos que queramos añadir para identificarlo, que quedarán el Payload del Token (ver documentacion de JWT).

Este Token que genera en un String, será lo que vamos a utilizar para autorizar nuestros request al hacer llamadas a nuestra Api.

tokenGen

Ejecutamos el método main de la clase de ejemplo. Esto nos da una salida por pantalla como en la imagen anterior, con el Token que utilizaremos.

Cuando hagamos las pruebas en Postman, veremos cómo incluir un parámetro en el Header de los Requests con esta información. En este parámetro indicaremos el Token con el que vamos a realizar las llamadas securizadas.

En la siguiente entrada de esta serie de posts, veremos cómo hacer pruebas de nuestra Api con la herramienta Postman.

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s