Creé el servidor de autorización Spring que emite JWT-s y un servidor de recursos que verifica el JWT, sus reclamos y permisos en el servidor de autorización. Para ello, he seguido este artículo .
Mi pregunta es por qué necesito enviar el encabezado de Authorization con autorización HTTP básica y nombre de usuario/contraseña codificados en Base64 (ClientId:ClientSecret) en la solicitud de obtención de token. He visto implementaciones de JWT donde solo se requiere nombre de usuario y contraseña.
Es parte de la especificación, ver RFC 6749 :
2.3 Autenticación del cliente
Si el tipo de cliente es confidencial, el cliente y el servidor de autorización establecen un método de autenticación de cliente adecuado para los requisitos de seguridad del servidor de autorización. El servidor de autorización PUEDE aceptar cualquier forma de autenticación de cliente que cumpla con sus requisitos de seguridad.
A los clientes confidenciales normalmente se les emite (o establecen) un conjunto de credenciales de cliente que se utilizan para autenticarse con el servidor de autorización (por ejemplo, contraseña, par de claves pública/privada).
El servidor de autorización PUEDE establecer un método de autenticación de cliente con clientes públicos. Sin embargo, el servidor de autorización NO DEBE basarse en la autenticación pública del cliente con el fin de identificar al cliente.
El cliente NO DEBE utilizar más de un método de autenticación en cada solicitud.
De forma predeterminada, Spring Security OAuth 2.0 protege el extremo del token; consulte la Guía para desarrolladores de OAuth 2 :
El punto final del token está protegido por usted de manera predeterminada por Spring OAuth en el soporte de
@Configurationusando la autenticación HTTP básica del secreto del cliente.
Pero parece que puede deshabilitar la autenticación del cliente:
Esa es la estructura del token JWT:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret ) As you are doing a JWT implementation all the 3 parts must be there: header.payload.secretTal vez en la implementación que ha visto, el servidor estaba trabajando con Default Secret