2016-09-13 6 views
8

私は自分のアプリケーションでSpring Socialを使用しようとしており、元の 'OAuth2'状態パラメータが常にアプリケーション上でnullであることをデバッグ中に気付きました。元の 'OAuth2'状態パラメータがorg.springframework.social.connect.web.ConnectSupportのnullになる原因は何ですか?

以下 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をコメントアウトすることで

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

のOAuth2状態パラメータの問題が並べ替えられました。

P.S.今私は春の社会は、春のセッションの私の現在の構成で動作するように取得する方法を見つけるために持っているが...

編集:私は(春のセッション側)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から取得したものはリクエスト属性ではなく、リクエストパラメータです。

のようにあなたは何かにそれを取得する必要があります:それは問題は私がヘッダに頼ったという事実によって引き起こされたことが判明し

​​
+0

こんにちはRiccardo、上記(私の投稿)は実際にSpring Socialのソースコードです。状態を設定して適切に取得するために、ユーザー側でどのような特別な設定を行う必要があるのだろうかと思っていただけです... – balteo

0

は、この回避策を試してみて、それがあなたのために働くかどうかを確認:

私へ驚いたことに、シークレットブラウザでアプリケーションを開き、すべてが機能しました。ちょうどそれのように。私は何かがキャッシュされて問題を引き起こす前に思っています。

今日この問題が発生しました。私のアプリケーションは正常に動作していました。私はちょうど数時間休憩をとりました。また、私はもう一度それを走らせましたが、 'OAuth2'状態のパラメータが不足しているか不一致です。 状態パラームが最初にセッションに入れられ、要求はフェイスブックに送られ、同じ状態パラメタで要求が返されますが、春がセッションオブジェクトを探して状態変数を取得しているときにセッションを見つけることができません。私はそれが古いHttpSessionオブジェクトがまだ存在していても、リクエストが戻ったときに別のクライアント(またはホスト)だと思うので、セッションを見つけることができないと思います。コンテナはクライアントごとにHttpSessionを保持します。

関連する問題