oauth 2.0 - example - ¿Qué podría hacer que el parámetro de estado ''OAuth2'' original sea nulo en org.springframework.social.connect.web.ConnectSupport?
spring social security (3)
Intento usar Spring Social en mi aplicación y me di cuenta al depurar que el parámetro de estado ''OAuth2'' original siempre es nulo en mi aplicación.
Consulte el código fuente de Spring Social para org.springframework.social.connect.web.ConnectSupport
continuación:
private void verifyStateParameter(NativeWebRequest request) {
String state = request.getParameter("state");
String originalState = extractCachedOAuth2State(request);//Always null...
if (state == null || !state.equals(originalState)) {
throw new IllegalStateException("The OAuth2 ''state'' parameter is missing or doesn''t match.");
}
}
private String extractCachedOAuth2State(WebRequest request) {
String state = (String) sessionStrategy.getAttribute(request, OAUTH2_STATE_ATTRIBUTE);
sessionStrategy.removeAttribute(request, OAUTH2_STATE_ATTRIBUTE);
return state;
}
Alguien puede ayudarme porfavor?
editar : veo el parámetro de estado pasado por facebook:
Request URL:https://www.facebook.com/v2.5/dialog/oauth?client_id=414113641982912&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fconnect%2Ffacebook&scope=public_profile&state=0b7a97b5-b8d1-4f97-9b60-e3242c9c7eb9
Request Method:GET
Status Code:302
Remote Address:179.60.192.36:443
edición 2 : Por cierto, la excepción que recibo es la siguiente:
Exception while handling OAuth2 callback (The OAuth2 ''state'' parameter is missing or doesn''t match.). Redirecting to facebook connection status page.
Lo que obtienes de Facebook no es un atributo de solicitud, es un parámetro de solicitud.
Deberías obtenerlo por algo como:
request.getParameter("state")
Resultó que el problema fue causado por el hecho de que confiaba en encabezados , en lugar de cookies, para administrar la sesión.
Comentando el siguiente bean de configuración de la sesión de primavera:
@Bean
public HttpSessionStrategy sessionStrategy(){
return new HeaderHttpSessionStrategy();
}
El problema del parámetro de estado oauth2 fue ordenado.
PD Ahora tengo que encontrar una manera de hacer que Spring Social funcione con mi configuración actual de Spring Session ...
Editar : Logré mantener la HeaderHttpSessionStrategy (en el lado de la sesión de primavera) y ponerla a funcionar implementando mi propia SessionStrategy (en el lado social de primavera) de la siguiente manera:
public class CustomSessionStrategy implements SessionStrategy {
public void setAttribute(RequestAttributes request, String name, Object value) {
request.setAttribute(name, value, RequestAttributes.SCOPE_SESSION);
}
public Object getAttribute(RequestAttributes request, String name) {
ServletWebRequest servletWebRequest = (ServletWebRequest) request;
return servletWebRequest.getParameter(name);
}
public void removeAttribute(RequestAttributes request, String name) {
request.removeAttribute(name, RequestAttributes.SCOPE_SESSION);
}
}
Pruebe este trabajo y vea si eso funciona para usted:
Para mi sorpresa, abrí la aplicación en un navegador de ''incógnito'' y todo funcionó. Así. Creo que antes de que algo se almacenara en caché y estaba causando el problema.
Me encontré con este problema hoy. Mi aplicación funcionaba perfectamente bien. Acabo de tomar un descanso durante unas horas y cuando lo ejecuté nuevamente, me quejé de que ''El parámetro'' OAuth2 ''state'' falta o no coincide ''. El parámetro de estado se pone primero en la sesión, luego la solicitud se envía a Facebook y la solicitud vuelve con el mismo parámetro de estado, pero cuando la primavera busca el objeto de sesión para obtener el parámetro de estado, no se encuentra la sesión. Creo que no se trata de encontrar la sesión porque, cuando la solicitud vuelve, piensa que se trata de un cliente (o host) diferente, aunque el antiguo objeto HttpSession aún exista. El contenedor mantiene una HttpSession por cliente.