首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >微服务方法之间的身份验证

微服务方法之间的身份验证
EN

Stack Overflow用户
提问于 2017-08-10 22:38:52
回答 3查看 15.8K关注 0票数 27

我目前正在构建一个基于微服务架构的API。

我使用JWT对用户进行身份验证。我知道当用户发送登录请求时,会返回一个包含用户身份及其角色/权限等信息的JWT。然后,该令牌与用户的后续请求一起发送,以告知服务器是谁在发送请求。我认为这是正确的理解。

在普通的单片架构中,正如所解释的那样,这可以很好地工作。我如何将其转移到微服务体系结构,以在微服务之间建立信任。

我可以简单地将用户JWT转发到下游微服务,但这不允许下游微服务知道谁/哪个上游微服务正在发送请求。

举个例子,我有一个位置微服务。我希望允许餐厅微服务对位置微服务进行呼叫。但我也有一个产品微服务,我不想将其称为位置微服务。

显然,我可以不编写产品微服务的代码来调用位置微服务,但这并不能阻止其他人这样做。

有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2020-07-19 01:52:51

您至少可以通过以下两种方法确保微服务之间的通信安全:

  1. JWt token :假设微服务A希望与微服务B通信,则A发布的令牌和令牌的受众是B。在这种情况下,该令牌由微服务A使用其私钥签名。JWT中的aud字段将代表受众,它可以是单个服务,也可以是一组服务。aud参数的值应该是服务之间预先约定的值。在微服务中,您可以使用正则表达式来验证受众。例如,aud可以是*.samplemicroservice.com。观众服务B可以通过检查aud字段来检查令牌是否是为其设计的。一旦确认,它就可以使用发行者的公钥来验证它。

  1. 相互SSL :实现它的直接方法是在服务之间使用相互ssl。每个服务都应该启用SSL,并且应该将其证书提供给另一个服务,而其他服务应该使用信任存储区检查证书的有效性。这应该在微服务A和微服务B上进行验证,以达成双方的协议。自签名证书可以用作所有服务证书的根CA,并且可以通过信任存储区进行访问。

这些机制可以有许多变体。特别是在JWT令牌情况下。例如,您可以将令牌颁发责任委托给一个服务,并且可以使用颁发者服务的公钥来验证每个服务中的令牌。

票数 7
EN

Stack Overflow用户

发布于 2020-06-09 23:26:08

这里你有两个不同的问题要解决!

1)用户认证/授权:

您的下游服务应该将用户JWT令牌传递给上游服务(下行依赖于上游,下游更靠近前端)。这样,所有的服务都可以验证JWT令牌,并且我们可以保证令牌是不变的。

2)微服务授权:

这是您的第二个场景,您需要保证微服务和访问资源的授权之间的信任关系。在这种情况下,在身份验证服务(密钥伪装,身份验证服务...)中,微服务是否必须是客户端(充当用户)?并且在向任何上游依赖项发送请求之前,应该对其进行身份验证,并发送他自己的JWT令牌,这样目的微服务(被调用的微服务)就可以验证并允许或不允许调用者访问资源,然后检查最终用户凭据。

这种方法可以使用客户凭证身份验证流(https://oauth.net/2/grant-types/client-credentials)来实现。

请参阅本文:https://developer.okta.com/blog/2018/04/02/client-creds-with-spring-boot

票数 2
EN

Stack Overflow用户

发布于 2020-01-06 19:44:06

我想这个解决方案应该是将JWT传递到网关层/聚合器/门面层。

在这一层,只需解码JWT并在DTO(任何Java类)中设置数据,这样就可以很容易地访问它们。

现在,当需要将此信息传递给任何服务时,这些信息应该作为参数传递,因为服务层的API应该是通用的。

现在,如果你想建立信任的b/w服务,你可以简单地检查参数,因为这些服务无论如何都不应该暴露在聚合器之外。

希望我说得有道理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45616764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档