【发布时间】:2017-12-17 01:15:51
【问题描述】:
我尝试将 Oauth2/OpenId Connect 实现到基于 Java/Spring Cloud 的微服务架构中。我目前的问题是关于微服务之间或通过 RabbitMQ 等消息代理的令牌传播。
很少有话题谈论这个。我只找到了这个Stackoverflow 线程,但我不喜欢建议的答案。
以下是不同的情况:
我的微服务 A 接收到由最终用户发起的请求,该请求通过 API 网关并携带有效的访问令牌(JWT 与最终用户对应的范围/声明:用户名、id、电子邮件、权限等)。这个案子没有问题。微服务拥有处理请求的所有信息。
第一个问题:如果微服务 A 需要调用微服务 B 会发生什么?
- 第一种解决方案:微服务 A 将访问令牌发送给微服务 B
==> 如果令牌在到达微服务 B 之前过期会怎样?
- 第二个解决方案:使用 OAuth(又名服务帐户)提出的“客户端凭据授予”。这意味着微服务 A 使用自己的凭据请求一个新的访问令牌,并使用它来调用微服务 B。
==> 使用此解决方案,与用户相关的所有数据(用户名、ID、权限等)都会丢失。
例如,微服务 B 中被调用的方法需要用户 id 才能工作。用户 id 值可以设置为查询字符串。 如果使用用户访问令牌调用该方法,则微服务 B 可以验证查询字符串中的用户 ID 值是否等于 JWT 令牌中的用户 ID 值。 如果使用服务访问令牌调用该方法,则微服务 B 无法验证查询字符串值,需要信任微服务 A。
对于这个案例,我听说了来自 OAuth 2 的“token-exchange”草案。这个想法非常有趣。它允许微服务 A 将用户访问令牌转换为另一个权限较少但为微服务 A 伪造的访问令牌。不幸的是,这种机制仍处于草案阶段,并没有在很多产品中实现。
第二个问题:如果微服务 A 向 RabbitMQ 推送消息,而微服务 B 收到此消息会怎样?
- 第一种解决方案:身份验证和授权由 RabbitMQ 管理(vhost、帐户等)
==> 再一次,所有与用户相关的数据都丢失了。此外,我们有 2 个存储库来管理身份验证和授权
- 第二个解决方案:和第一个问题一样,使用“客户端凭据授予”
你怎么看?还有其他更好的解决方案吗?
提前致谢。
【问题讨论】:
-
感谢您的链接,但两者都在谈论一个基本用例,微服务之间没有通信(通过编排或编排)
-
您对这个问题有任何了解吗?
标签: authentication oauth authorization microservices openid-connect