当前位置: 首页 > 知识库问答 >
问题:

在REST微服务上使用Zuul代理、Oauth2实现认证和授权

万俟财
2023-03-14

我试图在Spring Boot的工作流程中实现上述架构

  • Web客户端通过Zuul Proxy向资源服务器(微服务endpoint)发出请求。
  • Zuul Proxy重定向到oaust2服务器进行身份验证。
  • 如果请求是否经过身份验证,Oau2将重定向到Zuul Proxy。
  • 如果未通过身份验证,Zuul会使用未经身份验证的响应重定向Web客户端。
  • 如果经过身份验证,Zull代理会重定向到请求的微服务endpoint。
  • 微服务endpoint检查用户是否被授权(用户级访问)访问资源。
  • 微服务也可以对其他微服务进行内部rest调用。
  • 最后,请求的资源被发回客户端。

我想确保我遵循正确的工作流程。

我想知道,是否有任何解决方案实现了类似的保护微服务API的解决方案。

我在以下方面感到困惑:

    如何将用户详细信息传递给微服务,
  • 以便微服务可以执行自己的用户授权级别?
  • 是否应将 OAuth2 访问令牌标头传递给每个微服务,以便微服务可以单独验证令牌?
  • 每个微服务是否应使用机密凭据来验证访问令牌,以便无法沿请求链伪造令牌?

我知道这是一个有点冗长的问题,但我还没有找到一个合适的解决方案,以上架构。

共有3个答案

微生良策
2023-03-14

我不确定您是否能够解决此问题,我可以看到这还没有回答,但是有一种方法可以将所有信息从JWT传递到所有下游微服务。编写自己的 ZuulAuthenticationFilter,然后创建以下方法

private void addClaimHeaders(RequestContext context, String token) {
    
    try {
        
        Map<String, Claim> claims = jwtTokenVerifier.getAllClaims(token);
        claims.forEach((key, claim) -> {
            
            context.addZuulRequestHeader("x-user-info-"+key, String.valueOf(claim.as(Object.class)));
        });
        
    }catch(Exception ex) {
        
        log.error("Error in setting zuul header : "+ex.getMessage(), ex);
    }
}

这样,您将在每个微服务的标头中从JWT获取信息,以“x-user-info-”开头的标头将包含您的JWT详细信息

黎浩然
2023-03-14

我一直在努力解决基于spring云解决方案的微服务架构的安全设计问题。我只发现这篇文章对它有所启发:https://developer.okta.com/blog/2018/02/13/secure-spring-microservices-with-oauth

但它与Okta sso服务提供商有关,而不是其他诸如密钥斗篷之类的开放服务器的通用解决方案。

我还看到了一些关于如何使用 oauth2 服务器保护网关和微服务的解决方案,如下所示:https://github.com/jgrandja/oauth2login-gateway

但是它没有考虑到web客户端。

谢弘阔
2023-03-14

不幸的是,我没有完整的答案,只有一些部分:

一旦JWT令牌可用于zuul代理,则每个微服务都可以通过配置其资源服务器来授权请求,例如。

 @Override
  public void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests().anyRequest().access("#oauth2.hasScope('microserviceA.read')").and()
        .csrf().disable()
        .httpBasic().disable();
  }

范围可以由oauth微服务通过数据库进行管理——基于客户端凭证,它将获取范围信息并编码到JWT令牌中。

我目前不知道的是 - 如何使 zuul 代理使用“Web 客户端”凭据由 oauth 授权自己 - 我不想对 zuul 代理凭据进行硬编码,因为这样就不会使用 Web 客户端信条。

我刚刚发布了关于这个主题的类似问题:通过oauth服务器通过spring网关和zool授权请求

更新:我发现了一篇描述几乎这种配置的文章(没有尤里卡,但这并没有增加我的经验中的复杂性):https://www.baeldung.com/spring-security-zuul-oauth-jwt,有一个带有源代码的github项目。不幸的是,源代码没有经过润色,因为作者正在将其用于商业课程。但我已经成功地从他的示例工作集中进行了构建。

摘要:在描述的体系结构中,每个资源服务器(微服务 A、B 等)都会接收由 zuul 代理/网关从请求客户端转发的 JWT 令牌。令牌在请求标头中转发。如果未提供有效的令牌,则网关会将请求重定向到授权页面。此外,每个资源服务器都可以使用 oauth 服务检查令牌,如果需要,可以按照我上面写的那样进行范围检查。

 类似资料:
  • 以下是不同的情况: 我的微服务A接收通过API网关并携带有效访问令牌的最终用户发起的请求(JWT,其作用域/声明对应于最终用户:用户名、id、电子邮件、权限等)。这个案子没问题。微服务拥有处理请求的所有信息。 第一个问题:如果微服务A需要调用微服务B会发生什么? null null 例如,微服务B中被调用的方法需要用户id才能工作。用户id值可以设置为查询字符串。如果使用用户访问令牌调用该方法,则

  • 我正在为我们的应用程序使用Spring boot Microservices体系结构。在我们的项目中,我们使用的是OAuth2、Jwt、Zuul和Eureka服务,我的疑问是,我是否需要将这些服务作为一个独立的服务来实现,或者我是否可以将所有服务开发成一个单一的应用程序。 如果我必须作为单个应用程序实现,那么更好的方法是什么。请澄清

  • 我最近读了不少关于微服务的文章,尤其是关于AuthN和Authz的文章。在很大程度上,这一切都很有意义,我可以看到这一切应该如何工作。 (注意--现在我只实现了客户端凭据授予和资源所有者密码凭据授予,因为我只是想看看它是如何工作的,而且用curl调用它们更容易。但我不知道这有什么不同)

  • 我有一个名为country-service的微服务,它使用oAuth2受到保护。当我直接向该服务发送请求(包括我的JWT承载令牌)时,一切正常: 我还有一个api-gateway(Zuul代理): 除了这两个文件没有其他文件 注意:当我从资源服务器上删除oAuth2安全性时,Zuul代理似乎可以工作。 有人知道我在这里做错了什么吗?

  • 我正在尝试设计一个JAAS微服务,它处理多个J2EE应用程序的用户身份验证。目前,我们有多个应用程序,它们根据LDAP进行身份验证,并具有独立的角色系统。现在我一直在设计应用程序和认证后端之间的接口。 通过自定义登录模块:设计一个自定义登录模块,使用我们登录服务中的非安全EJB接口进行身份验证和授权,但我记得读到登录模块不能注入EJB/使用EJB。 这是正确的起点,还是我有其他可能性从我们的应用程

  • null null myApp应用程序不能直接访问用户数据库,所有通信都只能通过用户认证微服务处理。 在过去的一周里,我广泛阅读了关于REST API中的授权/身份验证的内容,但仍然不知道如何为User->myApp和MyApp->User-Authentication微服务构建一个可靠的授权/身份验证系统。 这是我现在想出来的。 null Now, user signs in sending u