web-dev-qa-db-fra.com

Spring OAuth Serveur d'autorisation derrière Spring Cloud Zuul Proxy

Je développe actuellement une application basée sur une architecture de micro service. Nous utilisons une passerelle API implémentée à l'aide du serveur Zuul de Spring Cloud Netfix pour acheminer les demandes vers nos microservices.

Pour réaliser l'authentification unique pour tous nos services, je travaille actuellement sur un serveur OAuth2 configuré à l'aide de Spring Cloud Security. Le serveur est simplement une copie et un passé de l'implémentation dans le référentiel de Dave Syer: https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver

La principale différence est que je veux acheminer les requêtes vers mon serveur OAuth via le proxy Zuul. De cette façon, je n'aurai pas à exposer directement mon OAuth serveur et peut ajouter et supprimer dynamiquement Login Server.

Le problème est que je ne cherche pas à comprendre comment configurer correctement cette configuration. Lorsque j'essaie d'accéder à une ressource protégée sur le serveur OAuth, je suis redirigé vers la page de connexion. Ceci est bien sûr comme prévu. Mais je ne peux pas comprendre comment définir le nom d'hôte et le port utilisés Ce que je veux, c'est que le serveur transmette à un point de terminaison sur le serveur Zuul qui sera renvoyé par procuration au serveur OAuth. (La passerelle API Zuul devrait être le seul serveur le client ne parle jamais. Tout le reste sera caché.)

Comme c'est l'hôte et le port sont lus à partir de HttpServletRequest dans LoginUrlAuthenticationEntryPoint. Mais la requête que le serveur voit est la requête envoyée par le proxy Zuul. Je suis donc transmis à une adresse IP interne et non à un point de terminaison sur le proxy.

J'ai essayé de définir l'URL de la page de connexion dans WebSecurityConfigurerAdapter.configure(HttpSecurity) sur l'URL absolue de mon proxy Zuul. Mais cela a juste amené ma candidature à se plaindre de trop de redirections. (Cela pourrait avoir provoqué une boucle là-bas.)

Quelle serait la meilleure façon de mettre cela en place?

  • Dois-je implémenter une sorte de stratégie de transfert en remplaçant un bean?
  • Y a-t-il une option de configuration qui me manque?
  • Mon idée est-elle fausse? (Dans sa réponse à Comment éviter de rediriger vers un autre hôte avec Zuul? Dave Syer dit que vous ne le feriez pas normalement par proxy mais n'explique pas pourquoi.)
27
Tobias Kremer

Mise à jour : POC peut être trouvé ici https://github.com/kakawait/uaa-behind-zuul-sample


Avez-vous essayé de suivre la configuration (sur le serveur 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
      ...

Fondamentalement, cela fonctionne sur mon projet, la seule chose que je dois faire est de désactiver la protection CSRF sur /uaa/oauth/token route.

Le serveur d'authentification doit être allumé

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

Testé à l'aide de Spring-Cloud.Brixton.M3


Merci à @ thomas-letsch , vous devriez modifier votre sécurité comme suit (exemple)

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

Pour autant que je comprends votre question, spring-cloud-security (pour le EnableOauth2Sso partie) et spring-cloud (pour zuul), il n'est pas possible de proxyer les appels vers le serveur d'autorisation à l'aide de zuul. La raison principale étant que spring-cloud-security sécurise la passerelle indépendamment (et avant de prendre en compte) la logique du routage Zuul.

Ce qui signifie que (exemple de configuration de l'exemple de Dave Syer OAuth2 ) spring.oauth2.client.* configuration

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

est considéré avant permettant tout accès aux routes de Zuul zuul.routes.*

De plus, cette configuration permet à l'agent client de stocker deux cookies: un pour la passerelle et un pour le serveur d'autorisation.

J'espère que ça aide.

4
Jérémie