使用OAuth2 / OpenId Connect和微服务进行身份验证和授权

时间:2017-07-12 14:30:42

标签: authentication oauth authorization microservices openid-connect

我尝试将Oauth2 / OpenId Connect实现为基于Java / Spring Cloud的微服务架构。我目前的问题是关于微服务之间的令牌传播或者像RabbitMQ这样的消息代理。

很少有话题谈论这个。我只发现了这个Stackoverflow帖子,但我不喜欢提出的答案。

以下是不同的案例:

我的微服务A接收最终用户通过API网关发起并携带有效访问令牌的请求(JWT具有与最终用户相对应的范围/声明:用户名,ID,电子邮件,权限等)。这种情况没有问题。微服务具有处理请求的所有信息。

第一个问题:如果微服务A需要调用微服务B会发生什么?

  • 第一个解决方案:微服务A将访问令牌发送到微服务B

==>如果令牌在到达微服务B之前到期会发生什么?

  • 第二个解决方案:使用OAuth(aka服务帐户)提出的“客户端凭据授权”。这意味着微服务A请求具有自己凭据的新访问令牌,并使用它来调用微服务B。

==>使用此解决方案,与用户相关的所有数据(用户名,ID,权限等)都将丢失。

例如,微服务B中的被调用方法需要用户ID才能工作。用户标识值可以设置为查询字符串。 如果使用用户访问令牌调用该方法,则微服务B可以验证查询字符串中的用户id值是否等于JWT令牌中的用户id值。 如果使用服务访问令牌调用该方法,则微服务B无法验证查询字符串值,并且需要信任微服务A.

对于这个cas,我​​听说过来自OAuth 2的“token-exchange”草案。这个想法非常有趣。它允许微服务A将用户访问令牌转换为另一个具有较少权限的访问令牌,但是为微服务A伪造。不幸的是,这种机制仍处于草案状态,并未在很多产品中实现。

第二个问题:如果微服务A向RabbitMQ发送消息并且微服务B收到此消息会怎样?

  • 第一个解决方案:身份验证和授权由RabbitMQ(vhost,帐户等)管理

==>再次,所有与用户相关的数据都将丢失。此外,我们有2个存储库来管理身份验证和授权

  • 第二个解决方案:与第一个问题一样,使用“客户端凭据授权”

你怎么看?还有其他更好的解决方案吗?

提前致谢。

0 个答案:

没有答案