2016-09-13 11 views
8

Próbuję użyć Spring Social w mojej aplikacji i zauważyłem podczas debugowania, że ​​oryginalny parametr stanu "OAuth2" zawsze ma wartość null w mojej aplikacji.Co może spowodować, że oryginalny parametr stanu "OAuth2" będzie pusty w org.springframework.social.connect.web.ConnectSupport?

kod źródłowy See Wiosna społeczne org.springframework.social.connect.web.ConnectSupport poniżej:

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

Czy ktoś proszę mi pomóc?

edit: Widzę parametr stan jest przekazywana przez 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 

edycji 2: Nawiasem mówiąc, wyjątek otrzymuję to:

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

Odpowiedz

3

okazało się, że problem został spowodowany przez fakt, że byłem powołując się na nagłówkach - w odróżnieniu cookies - zarządzać sesję.

komentując poniższy wiosennej sesji konfiguracji Fasola:

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

Parametr kwestia stan OAuth2 została posortowana.

P.S.Teraz mam znaleźć sposób, aby uzyskać Wiosna Social pracować z mojej obecnej konfiguracji Spring Session ...

Edit: udało mi się utrzymać HeaderHttpSessionStrategy (z boku sesji wiosna) i uzyskać go do pracy poprzez wdrożenie własną SessionStrategy (na wiosnę strony społecznej) w następujący sposób:

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

Czy powinienem zachować zarówno strategię sesji nagłówkowej, jak i niestandardowej? Mam do czynienia z tym samym problemem. – gschambial

0

To, co otrzymujesz z Facebooka, nie jest atrybutem żądania, jest to parametr żądania.

Powinieneś dostać go za coś takiego:

request.getParameter("state") 
+0

Witam Riccardo, powyższy (mój post) to w rzeczywistości kod źródłowy ze Spring Social.Właśnie zastanawiałem się, jaki specjalny krok konfiguracji musiałem podjąć po stronie użytkownika, aby stan został poprawnie ustawiony i pobrany ... – balteo

0

Spróbuj pracę wokół i sprawdzić, czy to działa dla Ciebie:

do mojego niespodzianka Otworzyłem aplikację w przeglądarce "incognito" i wszystko działało. Właśnie tak. Myślę, że zanim coś zostało zbuforowane i spowodowało problem.

Wpadłem dzisiaj na ten problem, Moja aplikacja działała doskonale. Po prostu zrobiłem sobie przerwę na kilka godzin i kiedy uruchomiłem ją ponownie, zaczęło się narzekać na brak parametru "OAuth2" lub brak dopasowania. " Param stanu jest najpierw wprowadzany do sesji, a następnie żądanie wychodzi na facebooka, a żądanie wraca z tym samym parametrem stanu, ale gdy wiosna szuka obiektu sesji, aby uzyskać parametr stanu, nie znajduje sesji. Myślę, że nie znajduje sesji, ponieważ po otrzymaniu żądania uważa, że ​​jest to inny klient (lub host), mimo że stary obiekt HttpSession nadal istnieje. Kontener utrzymuje HttpSession na klienta.

Powiązane problemy