2017-08-07 3 views
0

J'utilise Zuul comme proxy inverse pour le routage des requêtes vers mes microservices. J'ai également activé le serveur de ressources (@EnableResourceServer) sur ce proxy inverse afin que les demandes soient autorisées sur mon serveur d'autorisation. Il n'y a pas de configuration du serveur de ressources, seulement quelques contournements de sécurité pour quelques requêtes, rien de plus. Ce proxy inverse transmet également simplement les en-têtes OAuth2 lors de l'acheminement des requêtes vers d'autres microservices afin que d'autres microservices puissent effectuer toutes les tâches liées à la sécurité, si nécessaire. Tout fonctionne parfaitement ... mais.Spring Cloud - Comment configurer OAuth2RestTemplate sur un proxy inverse Zuul pour passer des jetons d'autorisation?

Un de mes filtres zuul que j'ai créés est un filtre pour l'expansion des ressources. Cela signifie qu'il obtient automatiquement toutes les ressources associées en fonction des paramètres url fournis (par exemple, pour la ressource employé, le paramètre url peut être "expand = manager, contacts" et toutes ces données supplémentaires utilisent les liens HAL sur la ressource employee et ajoute les données supplémentaires à champ incorporé dans JSON). Le problème que j'ai est que lorsque je fais cette expansion, j'ai besoin d'utiliser RestTemplate pour faire l'expansion (pour obtenir toutes les données qui devraient être intégrées). Je ne suis pas capable de comprendre comment configurer le OAuth2RestTemplate afin qu'il ajoute l'en-tête d'autorisation OAuth2 aux demandes sortantes. J'ai essayé de la documentation nuage de printemps:

@Bean 
public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) { 
    return factory.getUserInfoRestTemplate(); 
} 

Mais j'ai une certaine exception de pointeur nul de OAuth2TokenRelayFilter. Il y a une condition dans ce filtre Htat ressemble à ceci:

restTemplate.getResource().getClientId() 
       .equals(auth.getOAuth2Request().getClientId()) 

mais restTemplate.getResource() retourne null et aussi getClientId() sur OAuth2Request instance renvoie null ... On dirait que je suis vraiment raté quelque chose.

Avant d'introduire OAuth2 la configuration de RestTemplate était:

@Bean 
@LoadBalanced 
RestTemplate restTemplate() { 
    return new RestTemplate(); 
} 

Donc, comme vous voyez l'équilibrage de charge est également nécessaire (utilisation de ruban pour l'équilibrage de charge, Eureka est utilisé pour la découverte de service qui est basé un alias de service, de sorte pas d'URL directe dans la configuration de zuul)

Avez-vous des suggestions pour le configurer?

Merci, Lukas

+0

Pour autant que je sais OAuth2RestTemplate va essayer d'obtenir un nouveau jeton de serveur OAuth2 au lieu de passer jeton existant à votre ressource des employés. Essayez de fournir un fournisseur de jeton personnalisé qui transmettra simplement le jeton existant. – tsolakp

+0

@tsolakp Mais je n'ai pas configuré le client OAuth2 sur ce proxy donc il ne connaît pas clientId et clientSecret. Donc, en fait, cela pourrait être le problème.Cependant j'ai compris d'un des chapitres de documentation de nuage de printemps (au sujet du relais de jeton) qu'il devrait travailler seulement avec le serveur de ressource et le client d'OAuth2 n'est pas nécessaire. –

Répondre

0

Ainsi, après une enquête plus approfondie que j'ai configuré le proxy inverse également OAuth2Client si le contexte de sécurité est correctement configuré pour chaque OAuth2TokenRelayFilter demande a commencé à travailler. Le chapitre de documentation du nuage de printemps «Resource Server Token Relay» décrit «le modèle de repos aura alors le même OAuth2ClientContext (demandé) qui est utilisé par le filtre d'authentification». ... Cela signifie que le client doit être activé par @ EnableOAuth2Client afin que OAuth2ClientContext soit correctement configuré.

J'espère que je le comprends correctement.

Lukas