Problema:
Tenemos una API RESTful basada en Spring MVC que contiene información confidencial. La API debe estar protegida, sin embargo, no es deseable enviar las credenciales del usuario (combinación de usuario / paso) con cada solicitud. Según las pautas REST (y los requisitos comerciales internos), el servidor debe permanecer sin estado. La API será consumida por otro servidor en un enfoque de estilo mashup.
Requisitos:
El cliente realiza una solicitud a
.../authenticate
(URL desprotegida) con credenciales; El servidor devuelve un token seguro que contiene suficiente información para que el servidor valide futuras solicitudes y permanezca sin estado. Esto probablemente consistiría en la misma información que el token Remember-Me de Spring Security .El cliente realiza solicitudes posteriores a varias URL (protegidas), agregando el token obtenido previamente como un parámetro de consulta (o, de manera menos deseable, un encabezado de solicitud HTTP).
No se puede esperar que el cliente almacene cookies.
Como ya usamos Spring, la solución debería hacer uso de Spring Security.
Hemos estado golpeando nuestras cabezas contra la pared tratando de hacer que esto funcione, así que espero que alguien ya haya resuelto este problema.
Dado el escenario anterior, ¿cómo podría resolver esta necesidad particular?
fuente
Respuestas:
Logramos que esto funcione exactamente como se describe en el OP, y esperamos que alguien más pueda hacer uso de la solución. Esto es lo que hicimos:
Configure el contexto de seguridad de esta manera:
Como puede ver, hemos creado una costumbre
AuthenticationEntryPoint
, que básicamente solo devuelve un401 Unauthorized
si nuestra solicitud no fue autenticada en la cadena de filtrosAuthenticationTokenProcessingFilter
.CustomAuthenticationEntryPoint :
AuthenticationTokenProcessingFilter :
Obviamente,
TokenUtils
contiene un código privado (y muy específico para cada caso) y no se puede compartir fácilmente. Aquí está su interfaz:Eso debería llevarte a un buen comienzo. Feliz codificación :)
fuente
validate(...)
método). Esto es importante porque quiero que el servidor permanezca sin estado. Me imagino que podría usar este enfoque sin necesidad de usar Spring.Puede considerar la autenticación de acceso implícito . Esencialmente, el protocolo es el siguiente:
Toda esta comunicación se realiza a través de encabezados, que, como señala jmort253, generalmente es más seguro que comunicar material sensible en los parámetros de la url.
La autenticación de acceso implícito es compatible con Spring Security . Tenga en cuenta que, aunque los documentos dicen que debe tener acceso a la contraseña de texto sin formato de su cliente, puede autenticarse correctamente si tiene el hash HA1 para su cliente.
fuente
Con respecto a los tokens que transportan información, JSON Web Tokens ( http://jwt.io ) es una tecnología brillante. El concepto principal es incorporar elementos de información (reclamos) en el token y luego firmar todo el token para que el extremo de validación pueda verificar que los reclamos son realmente confiables.
Uso esta implementación de Java: https://bitbucket.org/b_c/jose4j/wiki/Home
También hay un módulo Spring (spring-security-jwt), pero no he investigado qué admite.
fuente
¿Por qué no empiezas a usar OAuth con JSON WebTokens?
http://projects.spring.io/spring-security-oauth/
OAuth2 es un protocolo / marco de autorización estandarizado. Según la especificación oficial de OAuth2 :
Puedes encontrar más información aquí
fuente