Premier plan
Nous passons d'une plate-forme monolithique à une architecture davantage orientée services. Nous appliquons des principes DDD très basiques et divisons notre domaine dans différents contextes bornés. Chaque domaine est distribué et expose un service via une API web (REST).
En raison de la nature de notre entreprise, nous avons des services tels que Réservations, Services, Clients, Produits, etc.
Nous avons également mis en place un Identity Server (basé sur Thinktecture Identity Server 3) dont le rôle principal est de:
Nous avons également introduit le rôle d'une API Gateway qui centralise l'accès externe à nos services. API Gateway fournit des fonctionnalités qui ne nécessitent pas une connaissance approfondie des domaines internes tels que:
Autorisation
En ce qui concerne l'autorisation, celle-ci n'est pas gérée dans l'API Gateway mais dans les services internes lui-même. Nous effectuons actuellement 2 principaux types d'autorisations:
Pour pouvoir gérer l'autorisation dans les services internes, l'API Gateway transfère simplement le jeton (lors du routage de la demande vers le service interne) qui comprend à la fois des informations sur le client (l'application qui fait la demande) et le client en tant que réclamation (dans les cas où une personne est connectée dans l'application client).
Description du problème
Jusqu'ici tout va bien jusqu'à ce que nous introduisions la communication interservices (certains services peuvent communiquer avec d'autres services pour obtenir des données).
Question
Comment aborder l'autorisation dans les communications interservices?
Options envisagées
Pour discuter des différentes options, j'utiliserai l'exemple de scénario suivant:
Lorsque vous discutez de ce problème en interne, plusieurs options sont apparues, mais nous ne savons pas quelle option est la meilleure:
Merci d'avance pour votre contribution.
Je vous conseille d'avoir un interne canal de communication entre les microservices.
Par exemple, pour utiliser courtier de messages comme RabbitMQ en interne à envoyer/recevoir ou publier/s'abonner les messages entre les microservices.
Ensuite, votre premier utilisateur face au service "dans votre exemple, le service de réservation" sera chargé de valider le jeton et d'autoriser le client à effectuer cette opération spécifique en communiquant avec IdentityServer.
Ensuite, il communiquera avec le service Services via Message Broker et dans ce cas, il n'est pas nécessaire de valider à nouveau le jeton.
Je suppose que ce modèle sera plus simple et vous donnera de meilleures performances.