使用 JWT 保护微服务之间的通信

Posted

技术标签:

【中文标题】使用 JWT 保护微服务之间的通信【英文标题】:Secure communication between microservices using JWT 【发布时间】:2019-11-23 00:08:28 【问题描述】:

我使用 Spring Boot 构建了 3 个微服务:

1) Auth 服务 - 创建 JWT。

2 和 3 - 做某事的微服务 (REST API)。

理论上,用户可以在没有微服务 1 创建的令牌的情况下访问微服务 2 和微服务 3。

假设我将令牌传递给微服务 2 和 3 - 如何验证令牌的完整性?微服务 2 和微服务 3 是否需要与微服务 1 通信?

如果有人有一个很好的例子,那就太好了。

【问题讨论】:

您需要有以下场景,用户想要访问 2 和 3,然后从 2 和 3 需要针对 auth 进行通信,检查 JWT 令牌,然后如果没问题,继续 2 和3. 那就是。 这里可能使用的典型模式是网关/外观模式。任何微服务的所有传入请求都将首先到达网关 API,然后网关 API 将检查 JWT 以查看它是否仍然有效。如果不是,则该请求将立即被拒绝。否则,请求将被允许继续发送到微服务。 你好 Avi,看看我的回答,我也给出了一个工作示例 【参考方案1】:

JWT Example

1. /authenticate --> Auth Service - Creates JWT.
2. /public/profile --> can be accessed without JWT Token
3. /public/resource --> can be accessed without JWT Token
4. /private/users --> can be accessed with JWT Token

考虑您的应用程序的上述端点。这里,

/**/public/** 所有人都可以访问,这无关紧要 JWT Token 是否存在 /**/private/** 将可供拥有 JWT 的客户端访问 令牌。如果令牌不存在,它将以 401/403 响应 (未经授权/禁止)

现在进入编码部分。您必须创建一个扩展 WebSecurityConfigurerAdapterWebSecurityConfig 类,该类覆盖 configure(HttpSecurity http)

public class WebSecurityConfig extends WebSecurityConfigurerAdapter
 
    @Override
    protected void configure(HttpSecurity http) throws Exception 
    http
    .csrf().disable()
    .cors().disable()
    .authorizeRequests()
        .antMatchers("/authenticate").permitAll()
        .antMatchers("/**/private/**").authenticated()
        .anyRequest().permitAll() 
        .and()
    .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
    .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint);
   

如果您想对所有请求进行身份验证,请将 .anyRequest().permitAll() 更改为 .anyRequest().authenticated()。

您还可以将端点添加到您不想为其应用 Spring Security 过滤器链的配置(WebSecurity web)。

@Override
    public void configure(WebSecurity web) throws Exception 
        web
          .ignoring()
            .antMatchers("**/public/**")
    

What is the difference between HttpSecurity and WebSecurity?

【讨论】:

以上是关于使用 JWT 保护微服务之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

用Token令牌维护微服务之间的通信安全的实现

如何保护服务器-服务器应用程序中的通信?

Kubernetes集群中微服务之间如何进行JWT认证

有没有一种方法可以在不使用 APi 网关架构的情况下使用 Jwt 保护微服务端点

使用 WSO2 身份服务器通过 JWT 保护 WSO2 微服务

SpringCloud(10)使用Spring Cloud OAuth2和JWT保护微服务