我有一个设计问题,我不确定如何解决。
让我们说我的主要应用程序包含6个模块:
客户端应该只与网关服务进行通信。
我应该让我的网关进行用户身份验证(理想情况下会导致JWT),其他3个生产服务(论坛,图库,消息)只需验证令牌并检索权限和角色他们自己管理给那个给定的用户?
Click here如果您愿意,可以使用原始的draw.io图形。
我不想使用任何第三方授权服务;我只想要我的auth-service(已经完成了)来注册用户并让他们登录。或者我应该在该服务中管理权限和角色吗?
我试图围绕这个问题包围我好几个月,但我根本找不到合适的结构,所以我可以让用户注册,登录/注销并与各种生产服务进行通信。我目前正在使用Java作为后端的东西,但微服务的好处是,我不必为它们使用一种编程语言。
欢迎任何帮助!
P.s。:我读过Microservice Authentication strategy和Zuul - Api Gateway Authentication,但两者似乎都不适用于我的情况。
答案 0 :(得分:5)
我使用以下设置,效果很好:
现在,这是我们在没有任何第三方帮助的情况下实现的简单工作流程。在某些时候,我们确实必须使用会话cookie,但这是出于其他原因。请注意,除了auth服务中的黑名单外,系统几乎是无状态的。 One does not simply log out with jwt!我们有一个REDIS来管理黑名单。您可以在网关或身份验证服务处使用会话Cookie进行注销。
大多数后端服务都希望在jwt中具有它们自己的一组角色/特权/权利。角色由auth服务授予用户,并写入授予的jwt中。如果将新角色分配给用户,则该用户必须注销/登录以反映该特权。如果删除了某些特权,则用户必须强制注销-这就是REDIS播放的位置。
答案 1 :(得分:2)
这取决于权限设置的复杂程度。
如果您的权限非常简单,即所有服务都需要身份验证并且只有一个角色可以使用,则可以在网关api上添加。
如果您需要更精细的方法,则需要在模块级别进行。通常,在微服务体系结构中,每个服务都将调用另一个服务,并且在模块级别具有授权设置可以避免预先了解网关api所需的所需权限。而且您可以部署这些模块中的每个模块而无需考虑其他服务,在方法级别上具有精细的权限等。