2016-09-13 6 views
8

Я пытаюсь использовать Spring Social в своем приложении, и во время отладки я заметил, что исходный параметр состояния «OAuth2» всегда имеет значение null в моем приложении.Что может привести к тому, что параметр состояния «OAuth2» будет пустым в org.springframework.social.connect.web.ConnectSupport?

См Spring Социальный исходный код org.springframework.social.connect.web.ConnectSupport ниже:

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;  
} 

Может кто-нибудь, пожалуйста, помогите?

редактировать: Я вижу состояние параметра передается обратно на 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 

редактировать 2: Кстати, исключение я получаю следующее:

Exception while handling OAuth2 callback (The OAuth2 'state' parameter is missing or doesn't match.). Redirecting to facebook connection status page. 

ответ

3

Оказалось, что проблема была вызвана тем, что я опираясь на заголовки - в отличие от печенья - управлять сеанс.

закомментировав следующую весеннюю сессию конфигурации боба:

@Bean 
public HttpSessionStrategy sessionStrategy(){ 
    return new HeaderHttpSessionStrategy(); 
} 

Проблема oauth2 параметра состояния была отсортирована.

P.S.Теперь я должен найти способ, чтобы получить Spring Social работать с моей текущей конфигурации весенней сессии ...

Редактировать: Мне удалось сохранить HeaderHttpSessionStrategy (на стороне весенней сессии) и получить его работы по реализации моего собственного SessionStrategy (на пружинном социальной стороне) следующим образом:

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); 
    } 
} 
+0

Должен ли я хранить как заголовки, так и пользовательские стратегии сеанса? Я столкнулся с той же проблемой. – gschambial

0

То, что вы получаете от Facebook, не является атрибутом запроса, это параметр запроса.

Вы должны получить его что-то вроде:

request.getParameter("state") 
+0

Hi Riccardo, вышеприведенное (мое сообщение) на самом деле является исходным кодом от Spring Social.Мне просто интересно, какой особый шаг конфигурации я должен был выполнить с пользовательской стороны, чтобы состояние было правильно настроено и правильно восстановлено ... – balteo

0

Попробуйте эту работу вокруг и увидеть, если это работает для вас:

к моему Я открыл приложение в браузере «инкогнито», и все сработало. Просто так. Я думаю, прежде чем что-то зашифровано и вызвало проблему.

Я столкнулся с этим вопросом сегодня, мое приложение работает отлично. Я немного передохнул несколько часов, и когда я снова запустил его, он начал жаловаться на то, что параметр «Состояние OAuth2» отсутствует или не совпадает ». Параметр состояния сначала помещается в сеанс, затем запрос отправляется в facebook, и запрос возвращается с тем же параметром состояния, но когда весна ищет объект сеанса для получения параметра состояния, он не находит сеанс. Я думаю, что он не находит сессию, потому что когда запрос возвращается, он думает, что это другой клиент (или хост), хотя старый объект HttpSession все еще существует. Контейнер поддерживает HttpSession для каждого клиента.