martes, 7 de octubre de 2014

Oauth 2.0 (seguridad nuestra Api Rest)

Hola

En esta entrega vamos a hablar Oauth (Open Authorization) es un protocolo abierto,
que permite autorización segura de una API de modo estándar y simple para aplicaciones de escritorio, móviles y web.

En como siempre vamos a explicar lo que es oauth version 2.0 y posteriormente un ejemplo. A continuación se muetra una imagen mostrando el baile de Oauth 2.0



El acceso de los clientes a su aplicación (1) y hace que la solicitud para acceder a un recurso protegido (2).
 El servidor de autenticación devuelve un token de acceso basado en las credenciales de usuario publicado (3).  Después, el usuario realiza una solicitud para acceder a los recursos con el token obtenido anteriormente (4).  Una vez que el token se valida, el servidor de recursos devuelve el recurso protegido a la aplicación cliente (5).

Asi se tiene una idea global del funcionamiento de Oauth 2.0, ahora vamos a ver un diagramas que muestra mas claro el funcionamiento








Este ejemplo muestra como sería usando grant_type "password y refresh_token", hay más opciones que no vamos a ver aquí pero si quereís más información.

Como véis la primera petición se envía la información de usuario, contraseña, client_id y password, la respuesta es el access_token y token_refesh. El access_token es el token que vamos a usar para poder acceder a los recursos, como podemos ver en la segunda petición.

Los tokens tiene un tiempo de duración, cuando accedemos a los recursos y obtenemos el mensaje “invalid_token” debemos solicitar un nuevo token usando el token_refresh que obtenimos anteriormente.





Como veis la petición de refresco del token es muy parecida a la de obtención de token (no enviamos el usuario y contraseña)

Como se puede ver es muy intuitivo el protocolo oauth 2.0 como siempre hay varias implementaciones de oauth 2.0:


  • Spring Oauth
  • Apache Oltu
  • Picketlink
El ejemplo que tenemos hemos usado Spring Oauth 2.0, como siempre esta subido a github.com

7 comentarios:

  1. El ejemplo que tienes echo, podrías poner un poco de bibliografia para poder entender cada paso que as echo? tanto a nivel de spring como porque utilizas dos servlets o incluso como se comunican spring con jersey.

    Muchas gracias y el ejemplo es genial.

    ResponderEliminar
  2. En el dummy has implementado cada SERVER que haces mención en la imagen y el cliente ?, así mismo la comunicación entre estos es vía HTTP (Rest) supongo, pero en si la interface principal es la que da la cara al cliente. No hay forma de que lo pruebes con SOAPUI que es más intuitivo.

    ResponderEliminar
  3. Consulta al correr la fuente en mención parece está incompleta ya que figura un bean de Spring que no se ha seteado: "Cannot resolve reference to bean 'clientDetails'" ..., revisando veo que realmente no existe y esto jala a otros beans de ref.

    ResponderEliminar
  4. Hola acabo de poder correr tu dummy y esta interesante. Debido a que no tengo ambiente para correr esos comando estoy simulando os request vía HTTP:

    Paso#1:
    Ejecuto: http://localhost:8080/JAX-RS-OAUTH-2-master/oauth/token?username=user1&password=user1&client_id=client1&client_secret=client1&grant_type=password
    Obtengo:
    { "access_token":"1f307c69-a2ec-4fb7-9dcb-bb76a26af6f7",
    "token_type":"bearer",
    "refresh_token":"2e546df0-5c1b-4a45-959f-0680f06494a0",
    "expires_in":299999,
    "scope":"read write" }

    Paso#2:
    Ejecuto (actualizando el 'acces_token siempre'): http://localhost:8080/JAX-RS-OAUTH-2-master/resources/jersey-hello.spanish?Authorization:Bearer 1f307c69-a2ec-4fb7-9dcb-bb76a26af6f7
    Obtengo: Debería obtener => hola mundo user1, pero se queda dentro del método: 'authenticate' justamente para el 'user1' y retorna el 'auth' y muestra:


    An Authentication object was not found in the SecurityContext
    unauthorized







    ResponderEliminar
    Respuestas
    1. Hola,consulta, como debria hacer la petiocn desde la web con ajax? estoy tratando de hacer lo siguiente, pero no tengo resultados.

      function myFunction(){
      $.ajax({
      type:"GET",
      async:false,
      crossDomain: true,
      dataType: "json",
      url: "http://localhost:8080/JAX-RS-OAUTH-2/resources/jersey-hello.spanish",
      beforeSend : function(req) {req.setRequestHeader('Authorization', 'Bearer bf02420f-d5ac-477e-99ce-a42ff2704771');},
      });
      }

      Eliminar
  5. Hola Javaman pudiste correr el ejemplo ?

    ResponderEliminar
    Respuestas
    1. Amigo, este blog esta totalmente olvidado, pero te comento que pude hacer de la sigueinte forma:

      la URL del servicio es : http://localhost:8084/JAX-RS-OAUTH-2/resources/jersey-hello.spanish

      Y en el header hay que inyectar el Authorization
      field--> Authorization
      value--> Bearer <>

      Espero te sirva esta respuesta tan tardía

      Eliminar