5
votes

Implémentation de l'authentification et de l'autorisation à l'aide de Zuul Proxy, Oauth2 sur REST Microservices

 Architecture des microservices

J'essaie d'implémenter l'architecture ci-dessus dans le flux de travail avec Spring Boot.

  • Le client Web envoie une requête au serveur de ressources (Microservices Endpoints) via Zuul Proxy.
  • Zuul Proxy redirige vers le serveur oauth2 pour l'authentification.
  • Oauth2 redirige vers Zuul Proxy si la requête est authentifiée ou non.
  • S'il n'est pas authentifié, Zuul redirige le client Web avec une réponse non authentifiée.
  • S'il est authentifié, le proxy Zull redirige vers le point de terminaison de microservice demandé.
  • Le point de terminaison du microservice vérifie si l'utilisateur est autorisé (accès au niveau de l'utilisateur) à accéder à la ressource ou non.
  • Microservice peut également effectuer un appel de repos interne vers un autre microservice.
  • Enfin, la ressource demandée est renvoyée au client.

Je veux m'assurer de suivre le bon flux de travail.

Je voudrais savoir s'il existe une solution qui a implémenté un type similaire pour sécuriser les API de microservices.

J'ai de la confusion sur:

  • Comment pouvons-nous transmettre les détails de l'utilisateur aux microservices afin que les microservices puissent effectuer leur propre niveau d'autorisation utilisateur?
  • L'en-tête du jeton d'accès OAuth2 doit-il être transmis à chaque microservices de sorte que les microservices puissent valider le jeton séparément?
  • Chaque microservice doit-il utiliser des informations d'identification secrètes pour valider le jeton d'accès afin que le jeton ne puisse pas être falsifié le long de la chaîne de demande?

Je sais que c'est une question un peu longue. Mais je n'ai pas trouvé de solution appropriée à l'architecture ci-dessus.


3 commentaires

Veuillez partager vos résultats ici. Je pense que c'est un très bon moyen de faire travailler les microservices ensemble et je cherche à faire de même


Veuillez rechercher Zuul agissant en tant que client OAuth2.0 ici: baeldung. com / spring-security-zuul-oauth-jwt


@Ananda: si ça marche, ça te dérangerait de mettre quelques détails ici?


4 Réponses :


1
votes

Malheureusement, je n'ai pas de réponse complète, seulement quelques parties:

Une fois que le jeton JWT est disponible pour le proxy zuul, chaque microservice peut autoriser les requêtes en configurant son serveur de ressources, par exemple

 @Override
  public void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests().anyRequest().access("#oauth2.hasScope('microserviceA.read')").and()
        .csrf().disable()
        .httpBasic().disable();
  }

Les étendues peuvent être gérées par le microservice oauth avec une base de données - en fonction des informations d'identification du client, il prendra les informations des étendues et encodera dans le jeton JWT.

Ce que je ne sais pas à le moment - comment faire en sorte que le proxy zuul utilise les informations d'identification du "client Web" pour s'autoriser par le oauth - je ne veux pas coder en dur les informations d'identification du proxy zuul car alors les crédits du client Web ne seront pas utilisés. p>

Je viens de publier une question similaire sur ce sujet: Autoriser les requêtes via Spring Gateway avec zool via le serveur oauth a>

mise à jour: J'ai trouvé un article décrivant presque cette configuration (sans eureka, mais cela n'ajoute pas beaucoup de complexité à mon expérience): https://www.baeldung.com/spring-security-zuul-oauth-jwt , il existe un projet github avec le code source. Le code source n'est malheureusement pas poli car il est utilisé par l'auteur pour ses cours commerciaux. Mais j'ai réussi à construire à partir de ses exemples de travail.

Résumé: dans l'architecture décrite, chaque serveur de ressources (microservice A, B, ..) reçoit le jeton JWT transmis par le proxy / passerelle zuul du client demandeur. Le jeton est transmis dans un en-tête de demande. Si aucun jeton valide n'est fourni, la passerelle redirige la demande vers la page d'autorisation. De plus, chaque serveur de ressources peut vérifier le jeton avec le service oauth et, si nécessaire, effectuer une vérification de la portée comme je l'ai écrit ci-dessus.


0 commentaires

0
votes

J'ai été aux prises avec le même problème de conception de sécurité pour l'architecture de microservice basée sur la solution Spring Cloud. Je ne trouve que cet article pour faire la lumière là-dessus: https://developer.okta.com/blog/2018/02/13/secure-spring-microservices-with-oauth

Mais cela concerne le fournisseur de services Okta sso, pas une solution générique pour un autre serveur oauth2 comme keycloak.

J'ai également vu des solutions sur la façon de protéger la passerelle et le microservice avec le serveur oauth2 comme celui-ci: https://github.com/jgrandja/oauth2login-gateway

Mais cela ne prend pas en compte le client Web.


1 commentaires

Le deuxième lien est une implémentation basée sur Spring Cloud Gateway et non sur Zuul.



-1
votes

Il existe une implémentation de l'architecture ci-dessus dans le lien suivant: https://www.baeldung.com/spring-security-zuul-oauth- jwt


0 commentaires

0
votes

Je ne suis pas sûr que vous ayez pu résoudre ce problème, je peux voir que cela n'a pas encore été répondu, mais il existe un moyen de transmettre toutes les informations de JWT à tous les microservices en aval. Écrivez votre propre ZuulAuthenticationFilter, puis créez la méthode ci-dessous

private void addClaimHeaders(RequestContext context, String token) {
    
    try {
        
        Map<String, Claim> claims = jwtTokenVerifier.getAllClaims(token);
        claims.forEach((key, claim) -> {
            
            context.addZuulRequestHeader("x-user-info-"+key, String.valueOf(claim.as(Object.class)));
        });
        
    }catch(Exception ex) {
        
        log.error("Error in setting zuul header : "+ex.getMessage(), ex);
    }
}

de cette façon, vous obtiendrez des informations de JWT dans les en-têtes de chaque microservice, les en-têtes commençant par "x-user-info-" auront vos détails JWT


0 commentaires