web-dev-qa-db-ja.com

Spring OAuth Spring Cloud Zuulプロキシの背後の承認サーバー

現在、マイクロサービスアーキテクチャに基づくアプリケーションを開発しています。 Spring Cloud NetfixのZuulサーバーを使用して実装されたAPIゲートウェイを使用して、リクエストをマイクロサービスにルーティングします。

すべてのサービスでシングルサインオンを実現するために、現在、Spring Cloud Securityを使用してセットアップされたOAuth2サーバーで作業しています。サーバーは基本的にDave Syer's Repoの実装のコピーと過去です: https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver

主な違いは、リクエストをZuulプロキシ経由でOAuthサーバーにルーティングすることです。この方法で、OAuthサーバーを直接公開する必要はありません。ログインサーバーを動的に追加および削除できます。

問題は、このセットアップを正しく構成する方法を理解するために継ぎ目がないことです。 OAuthサーバー上の保護されたリソースにアクセスしようとすると、ログインページに転送されます。これは当然のことですが、使用するホスト名とポートの設定方法がわかりません。転送したい場合は、OAuthサーバーにプロキシされるZuulサーバー上のエンドポイントに転送するサーバーです。(Zuul API-Gatewayは唯一のサーバーである必要がありますクライアントはこれまでに会話します。他のすべては隠されます。)

ホストとポートはHttpServletRequestLoginUrlAuthenticationEntryPointから読み取られるためです。ただし、サーバーに表示されるリクエストは、Zuulプロキシによって送信されたリクエストです。したがって、プロキシのエンドポイントではなく、内部IPに転送されます。

WebSecurityConfigurerAdapter.configure(HttpSecurity)のログインページのURLをZuulプロキシの絶対URLに設定しようとしました。しかし、これにより、アプリケーションがあまりにも多くのリダイレクトについて文句を言うようになりました。 (ループが発生した可能性があります。)

これを設定する最良の方法は何でしょうか?

  • Beanをオーバーライドすることにより、何らかの独自の転送戦略を実装する必要がありますか?
  • 欠落している構成オプションはありますか?
  • 私の考え自体は間違っていますか? ( Zuulで別のホストへのリダイレクトを回避する方法? Dave Syerは、通常これをプロキシしないと言いますが、理由は説明しません。)
27
Tobias Kremer

Update:POCはここにあります https://github.com/kakawait/uaa-behind-zuul-sample


次の設定を試してみましたか(zuulサーバーで):

zuul:
  routes:
    uaa-service:
      path: /uaa/**
      stripPrefix: false

security:
  # Disable Spring Boot basic authentication
  basic:
    enabled: false
  oauth2:
    sso:
      loginPath: /login
    client:
      accessTokenUri: https://<zuul hostname>/uaa/oauth/token
      userAuthorizationUri: https://<zuul hostname>/uaa/oauth/authorize
      ...

基本的に私のプロジェクトで動作するのは、/uaa/oauth/tokenルートのCSRF保護を無効にすることだけです。

認証サーバーがオンになっている必要があります

server:
  # Use different context-path to avoid session cookie overlapping
  context-path: /uaa

Spring-Cloud.Brixton.M3を使用してテスト済み


@ thomas-letsch のおかげで、次のようにセキュリティを微調整する必要があります(サンプル)

public void configure(HttpSecurity http) throws Exception { 
    http.logout().and()
        .antMatcher("/**").authorizeRequests() 
        .antMatchers("/index.html", "/home.html", "/", "/uaa/oauth/**").permitAll() 
        .anyRequest().authenticated().and() 
        .csrf().csrfTokenRepository(getCSRFTokenRepository()).ignoringAntMatchers("/uaa/‌​oauth/token").and() 
        .addFilterAfter(createCSRFHeaderFilter(), CsrfFilter.class); 
} 
19
Kakawait

あなたの質問を理解している限り、spring-cloud-security (のために EnableOauth2Sso part)およびspring-cloud(zuulの場合)、zuulを使用して認証サーバーへの呼び出しをプロキシすることはできません。主な理由はspring-cloud-securityは、Zuulルーティングのロジックを独立して(そして考慮する前に)ゲートウェイを保護します。

つまり、(Dave Syerの OAuth2 の例の構成の例)spring.oauth2.client.*設定

spring:
  oauth2:
    client:
      accessTokenUri: http://localhost:9999/uaa/oauth/token
      userAuthorizationUri: http://localhost:9999/uaa/oauth/authorize
      clientId: acme
      clientSecret: acmesecret

beforeと見なされ、Zuulのルートへのアクセスが許可されますzuul.routes.*

さらに、この設定により、クライアントエージェントは、ゲートウェイ用と認可サーバー用の2つのCookieを保存できます。

これがお役に立てば幸いです。

4
Jérémie