Spring Cloud + Zuul + JWT 用于值/引用令牌。

25

阅读文章如何在微服务中控制用户身份后,我一直在尝试实现这样的访问控制方案(值和引用令牌),但是在浏览了与Spring Security + OAuth + Zuul相关的多个其他主题和GitHub示例之后,我无法找到如何实现这一点的具体示例。所有涉及JWT的示例在返回令牌时都会返回用户详细信息,而我想避免这种情况。用户详细信息不应直接传递给客户端,而应传递给后端服务。教程Spring Security + AngularJs提供了很多关于如何将应用程序发展成为安全应用程序的信息,但使用了访问令牌或提到了通过JWT直接获取用户详细信息的可能性。

这个SO问题,使用Zuul作为认证网关@phoenix7360提出,正是我一直试图实现的方法,但它只提供了一个简要概述,说明了实施微服务安全性方案所需的配置。请参考此问题中的图片,以清晰地了解它的工作原理。

我无法完全理解Zuul预过滤器应该如何配置,以及授权服务器的配置应该是什么样子的。正如文章和SO问题中所述,流程大致如下:

外部(HTTPS)

  1. 客户端对OAuth2服务器进行身份验证
  2. OAuth服务器返回一个不透明的访问令牌(只有UUID没有其他信息)
  3. 客户端将请求发送到API网关,并在Authorization标头中包含访问令牌
  4. API网关使用Authorization标头向OAuth服务器请求用户详细信息
  5. OAuth服务器检查访问令牌是否有效,并以JSON格式返回用户信息

内部(HTTP/S)

  1. API网关创建一个包含用户详细信息的JWT,并使用私钥对其进行签名
  2. API网关将JWT添加到请求中并转发到资源服务器
  3. 资源服务器使用API网关的公钥验证JWT

注意:如果OAuth服务器指示访问令牌不再有效,则API网关应返回错误。

ZuulFilter如何工作?是否需要发出针对OAuth服务器的新请求(例如,通过RestTemplate),或者这些方案是否受当前实现支持?对于OAuth和Zuul的JavaConfig类是否需要特定的配置?如果有人知道一个可行的示例,那将非常有帮助,并且对于以后涉及此主题的参考也很好。

我正在使用Spring Boot(1.4.0-M3)+ Spring OAuth + Spring Cloud(Eureka、Ribbon、Zuul)

我知道这个问题与之前链接的问题非常相似,如果这不是正确的做法,我很抱歉,但我认为开一个新线程比在SO线程上寻求解决其他问题更好。

提前感谢!


https://github.com/azizkhani/PiggyMetrics - ali akbar azizkhani
https://jhipster.github.io/microservices-architecture/ - ali akbar azizkhani
如果您想要使用UAA,我认为Zuul不需要检查令牌并调用AuthorizeServer。但是当您没有UAA时,我认为Api Gateway就是AuthorizeServer。但在服务对服务的调用中,需要OAuth2RestTemplate获取令牌后才能调用服务方法。 - ali akbar azizkhani
为什么你想在网关中这样做呢?如果你想检查传入的JWT是否有效,以防万一,我可以理解,但是你的服务也需要消耗(并验证)这些令牌。但总的来说,你的流程看起来不错。除了一件事:应该先验证带有Oauth访问令牌的请求,然后在成功后创建JWT并签名 - 如果令牌无效则抛出错误。你还需要考虑一个端点,供其他服务检索所需的公钥以验证签名。 - rmalchow
1个回答

1
JHipster在处理此问题方面做得相当不错。如果我想简要说明登录过程,首先您需要登录,然后获取每个需要传递给下面的服务的信息(例如用户名、电子邮件等),然后将它们传递给您的微服务。 您可以查看下面的okta链接以获取更多信息: https://developer.okta.com/blog/2018/03/01/develop-microservices-jhipster-oauth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接