【发布时间】:2023-03-30 23:00:01
【问题描述】:
我正在设计一个基于微服务的应用程序,它有两个 API 端点,其中一个用于用户访问。通过 JWT 进行身份验证的用户可以属于不同的组织,这些组织又按层次结构进行组织。每个用户都可以有一些角色,这些角色是为每种组织类型定义的;组织和角色之间的组合定义了可以从用户(方法和资源)访问的 API。总之,它可能会变得一团糟!
有几个库提供 ACL 功能,但我想知道将它们放在哪里:第一个解决方案似乎是 API 网关,它应该为每个请求调用一个组件。
-JWT 包含用户的角色 ID 列表 -API 网关验证 JWT 并使用角色 ID 在表中查找每个角色都有权限列表(例如,可以 POST /users) - 如果角色与请求匹配,则将后者转发到正确的服务;否则,网关以 403 响应
另一种选择是将“身份验证服务”放入架构中。网关只是将所有请求转发到正确的服务,每个服务(可能依赖于公共库)将令牌发送到身份验证服务并请求授权以满足请求。在这种情况下,auth 服务是 /auth 资源下所有请求的“正确服务”,提供登录/注销、令牌刷新和新用户注册(例如当您单击登录邮件中提供的链接时)
第一个解决方案提供了一个“胖网关”,它有一个微小的逻辑层,但强制所有服务仅响应安全调用,分解所有身份验证/orization 逻辑并且不添加服务之间的依赖关系,但
p>- 这是正确的做法吗?
- 是否有提供该功能的 api 网关实现
- 这两种方法还有一些我看不到的其他优点/缺点
谢谢你的回答!!!
【问题讨论】:
-
您可能对 PolicyServer 的概念感兴趣:leastprivilege.com/2018/01/17/announcing-policyserver 另请查看演示视频:vimeo.com/223982185
-
谢谢!我看一眼!
-
您确定了解决方案@sscnapoli1926 吗?我现在正在思考完全相同的事情
-
@osteel ,现在,我们决定将 auth-service 排除在外:由于我们观察到与 api 网关的耦合,我们计划将其转换为插件以添加到我们的网关,使用 express-gateway (express-gateway.io) 实现。当工作完成时,我会在这里分享印象和结果!
-
@sscnapoli1926 感谢您回复我并分享您的方法。我可以看到将授权提取到自己的组件中的吸引力,因此微服务不需要处理它。就我而言,我倾向于第三种方法,即确实将身份验证留给网关,但让每个微服务负责自己的授权规则。
标签: architecture authorization microservices api-gateway