springframework - Solicite un nuevo token de acceso usando el token de actualización en la concesión de nombre de usuario y contraseña en Spring Security OAuth2
spring security oauth token (2)
Entonces, como dije, no usamos el secreto de un cliente, porque no podemos tenerlo en la aplicación del cliente Javascript. Y no es necesario de todos modos, cuando se utiliza la concesión de nombre de usuario y contraseña. (Vea la forma en que solicitamos el token de acceso). De hecho, estaba cerca de la solución y finalmente lo descubrí:
curl -v --data "grant_type=refresh_token&client_id=THE_CLIENT_ID&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token
por lo que no es necesario el token de acceso o el secreto del cliente
En general, se siente lo suficientemente seguro.
- No almacenamos ningún secreto en el lado de la aplicación del cliente.
- Los usuarios siempre necesitan una contraseña para iniciar sesión y solo pueden ver sus recursos.
- Limitamos la validez del token de actualización a un tiempo realista como una jornada laboral o algo así, de modo que, incluso si está comprometida, la ventana para un atacante está limitada y al mismo tiempo permite al usuario mantenerse conectado al servidor de recursos durante una larga sesión.
Estamos utilizando la concesión de nombre de usuario y contraseña para obtener un token de acceso de nuestro servidor de autenticación. Queremos actualizar el token de acceso antes de que caduque utilizando el token de actualización proporcionado hasta que el usuario cierre la sesión o cierre la aplicación cliente.
Sin embargo, simplemente no puedo encontrar ejemplos de cómo emitir esta solicitud de token de actualización ...
Para obtener el token llamamos algo como:
curl -v --data "grant_type=password&username=user&password=pass&client_id=my_client" http://localhost:8080/oauth/token
Así que para refrescarme, espero que la llamada se vea así:
curl -v --data "grant_type=refresh_token&access_token=THE_ACCESS_TOKEN&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token
o tal vez
curl -v -H "Authorization: Bearer THE_ACCESS_TOKEN" --data "grant_type=refresh_token&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token
Pero solo me dará un 401 ..
Oh si, tal vez necesito agregar el ID de cliente? No puedo usar el secreto del cliente, porque no hay ninguno (consulte la solicitud anterior para obtener el token). La autenticación se realiza utilizando el nombre de usuario y la contraseña después de todo ..
Creo que tenemos la configuración del servidor correcta, así que no la publicaré aquí. Si una de mis solicitudes de ejemplo debería funcionar y necesita ver las partes de configuración importantes, las agregaré.
¡Gracias!
Para la contraseña grant_type, se requieren un clientId y un clientSecret. Estuvo cerca con su tercer intento, pero pasa el ID de cliente y el secreto de cliente codificados en Base64 en lugar del token de acceso en el encabezado de Autorización. Esta es la solicitud de token de actualización adecuada:
curl -H "Authorization: Bearer [base64encode(clientId:clientSecret)]" "https://yourdomain.com/oauth/token?grant_type=refresh_token&refresh_token=[yourRefreshToken]"
Para una buena referencia, mira esto: http://techblog.hybris.com/2012/06/11/oauth2-resource-owner-password-flow/