Los servicios web que utilizan SOAP para el envío de mensajes han tenido la suerte de contar con la especificación Web Services Security (WS-SEC), la cual les permite incluir tokens de seguridad en la cabecera SOAP.
Mensaje SOAP con WS-SEC
Los token de seguridad más comunes en WS-SEC son:
De esta forma, se pueden proteger servicios web clásicos sin ningún problema de interoperabilidad, ya que existen numerosas implementaciones de WS-SEC para casi cualquier tipo de lenguaje de programación.
Para el caso de un escenario donde tenemos servicios web tipo REST, nos encontramos con un gran problema ya que el estándar WS-SEC no puede ser aplicado, ya que al usar peticiones HTTP estándares no existía forma de incluir dichos token de seguridad sin modificar los parámetros de cada petición, y no existe ningún estándar que cubra la necesidad de enviar tokens de seguridad en dicho escenario. Aunque el token de nombre de usuario (o Username Token) de WS-SEC podría mapearse sin muchos problemas al uso de HTTP Auth, si es cierto que no existe ninguna solución si nuestra arquitectura utiliza tokens basados en certificados digitales o aserciones SAML.
Afortunadamente, la semana pasada se publicó un draft a través de la IETF para la autenticación HTTP basada en tokens. Este draft busca dar una solución a la autenticación a través de tokens de OAuth, pero ofrece un modelo genérico que puede ser aprovechado por otro tipo de tokens más clásicos como los comentados más arriba.
Así, basándonos en dicho draft, una forma de proteger nuestros servicios web tipo REST utilizando certificados digitales quedaría tal como describe el siguiente ejemplo:
GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Token token=»h480djs93hd8…yZT4=»,
class=»x509″,
method=»rsassa-pkcs1-v1.5-sha-256″,
nonce=»dj83hs9s»,
timestamp=»137134190″,
auth=»djosJKDKJSD8743243/jdk33klY=»
Para el caso de querer proteger el servicio web tipo REST utilizando aserciones SAML, tendríamos una petición de este estilo:
GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Token token=»h480djs93hd8…yZT4=»,
class=»samlv2.0″,
method=»none»