2016-06-01 6 views
1

Spring Security OAuth2の例はたくさんあるようですが、そのほとんどは特定のポートのセットでlocalhostで実行されます。 AuthorizationServerとResourceServerに指定されたポートでアプリケーションを動作させることができました。私が取る必要があった次のステップは、このアプリケーションをプロキシサーバーの背後に移動することでしたが、アプリケーションが機能しなくなりました。主な問題はパスに関連しているようですが、私はOAuth2 Springをプロキシサーバーの背後に移動するタスクをどのように達成するかについての例がないことに苦労しています。私はWhitelabelApprovalEndpointをオーバーライドすることに重点を置いてきましたが、これが必要なのかどうかはわかりません。春のセキュリティOAuth2の背後にあるProxy Server

私は、WhiteLabelApprovalEndpointとほとんど同じコントローラを作成できましたが、プロキシの背後にあるように調整する方法はわかりません。

@Controller 
@SessionAttributes("authorizationRequest") 
public class ApprovalEndpoint { 

    @RequestMapping("/oauth/confirm_access") 
    ... 
     private static String TEMPLATE = "<html><body><h1>OAuth Approval</h1>" 
     + "<p>Do you authorize '${authorizationRequest.clientId}' to access your protected resources?</p>" 
     + "<form id='confirmationForm' name='confirmationForm' action='authorize' method='post'><input name='user_oauth_approval' value='true' type='hidden'/>%csrf%%scopes%<label><input name='authorize' value='Authorize' type='submit'/></label></form>" 
     + "%denial%</body></html>"; 
    ... 

私はクラスに作られた唯一の変化は

action='authorize' 

これは、POSTが行くことを可能にすると

action='${path}/oauth/authorize' 

を置き換えることにより、相対パスを作り、フォームアクション文字列を更新することでした正しいURLに

http://localhost/proxy/stuff/javaPath/oauth/authorize 

の代わりに

http://javaPath/oauth/authorize 

Apache(フロントエンドプロキシ)から送信された場合、後者はマップされません。しかし、私がauthorizationRequestがnullの場合は、この例外がAuthorizationEndpointでスローされていることがわかりエラー

error="invalid_request", error_description="Cannot approve uninitialized authorization request." 

につながるので、これは、Javaアプリケーション内の他の問題を作成することと思われます。これは、SessionAttributesが正しく設定されている私のカスタムクラスで処理する必要があるように見えますが、私がPOSTしているパスを更新するとこれを破るようです。

答えて

0

あなたはすでにそれを解決しているかもしれませんが、それは誰かを助けるかもしれないとして答えを掲示するかもしれません。

これは、エンドポイントURL(ドメイン+パス(プロキシを含む))の認証が一貫している必要があるためです。つまり、ローカルホストかプロキシパスかを問わず、一貫している必要があります。

OAuthはセッションを内部的に使用し、後で同じパス(POSTが発生したとき)からフェッチします。したがって、URLが変更された場合(POST)、セッションを取得できません。初期化されていない承認要求を承認できません。私の場合のために

、私は者として認可エンドポイントを使用していました:

https://mydomain/myapp/oauth/authorize?grant_type=authorization_code&client_id=clientid&redirect_uri=http://localhost:8181&response_type=code 

が、私が持っていたのプロパティで:

server: 
    session: 
    cookie: 
    path: /appProxy 
    context-path: /myapp 
    port: 8081 

を許可に成功した後、POSTがそれにしようと行われたとき/myappの代わりに/appProxy/myappからセッションをフェッチし、結果として初期化されていない承認要求を承認できません。

これを解決するには、私はSession.cookieを削除することができます。Oauthサーバーをhttps://mydomain/appProxy/myapp/oauth/authorize上で実行して、一貫性を持たせてください。

関連する問題