J'essaie d'implémenter l'architecture ci-dessus dans le flux de travail avec Spring Boot.
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:
Je sais que c'est une question un peu longue. Mais je n'ai pas trouvé de solution appropriée à l'architecture ci-dessus.
4 Réponses :
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.
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.
Le deuxième lien est une implémentation basée sur Spring Cloud Gateway et non sur Zuul.
Il existe une implémentation de l'architecture ci-dessus dans le lien suivant: https://www.baeldung.com/spring-security-zuul-oauth- jwt
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
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?