【发布时间】:2022-01-14 13:22:52
【问题描述】:
我正在考虑微服务架构,但我在授权和身份验证方面遇到了困难。我找到了很多关于 oauth2 和 openid connect 的资源,声称他们解决了问题,但对我来说还不够清楚。
假设我们有以下架构:
在我的系统中,我只想为role 定义的特定group 用户添加一项功能。我还想知道用户的name,他们的email和id。
经过研究,我发现以下解决方案是一个好的开始:
- SPA 应用程序显示
login form。 - 用户填写表格并向
authN&authZ server发送POST请求。 - 服务器回复
access token(作为JWT),其中包含用户的name、email、id和role。响应还包含refresh token。 - SPA 应用程序存储令牌并将其附加到它发出的每个请求中。
-
Microservice 1和Microservice 2检查令牌是否有效。如果是,他们检查角色是否正确。如果是这样,他们会获取用户信息并处理请求。
我离好的解决方案还有多远?登录流程看起来像 Implicit flow with form post 描述的 here 但有隐式同意,我不确定它是否正常。
展望未来,我发现在JWT(例如name、email)中传递用户数据并不是一个好的解决方案,因为它会暴露敏感数据。我发现资源说建议只在令牌中公开对用户的引用(例如ID),并在向微服务发送请求时将此类令牌替换为reverser-proxy/api gateway 中的经典access_token .考虑到这样的解决方案,我认为以下场景是一个好的开始:
- SPA 应用程序显示
login form。 - 用户填写表格并向
authN&authZ server发送POST请求。 - 服务器回复
access token和refresh token。 API 网关(中间)将access token替换为ID token,并将访问令牌中的声明存储在其缓存中。 - SPA 应用程序存储令牌并将其附加到它发出的每个请求中。
- 处理请求时,
API Gateway接受ID Token并根据用户 ID 生成新的access token。访问令牌被发送到微服务 1 或微服务 2,并像以前一样对其进行验证。
您如何找到这样的解决方案?这是一种安全的方法吗?我应该如何改进建议的流程?
提前致谢!
【问题讨论】:
-
您应该考虑将您的集群设为私有,并利用 api 网关作为唯一公开的 api 来处理您的所有身份验证。您的身份验证应该是第一道防线。在您的微服务之前。
-
你考虑过使用 BFF 模式吗? blog.bitsrc.io/…
-
@exceptionsAreBad 感谢您的回答。当然,微服务应该在私有集群中,API 网关是唯一公开的 API。我希望我在我的问题中提出的图表能够呈现它。 API Gateway 也负责处理身份验证。我的问题更多是关于如何处理身份验证。
-
@ToreNestenius 感谢您的回答。是的,我正在考虑使用 BFF 模式,但在我的问题中,外部 API 组件是 API Gateway 还是 BFF 并不重要。在我的示例中,只有一个客户端,所以实际上 API 网关是 BFF。
标签: oauth-2.0 architecture microservices openid-connect