java - 如何从另一个 Java 微服务使用 JWT 安全微服务

标签 java spring spring-boot jwt microservices

我的应用程序有多个微服务,包括:Auth、Game 和 Group。 当我按下前端(播放)上的按钮时,我正在调用 Group rest api 方法,比如说 foo()。 为了在组内实现 foo(),我需要 GET 调用游戏休息 api,但它是安全的。

当我登录 React 应用程序时,我从/login (Auth) 获取 JWT token 并将其存储在本地存储中。然后我成功地使用它从 Group 调用 foo(),但在 foo() 实现中我还需要使用 jwt token 以便能够从 Game 获取信息。

@Configuration
//+component scans...
public class GroupConfiguration {

    @Bean
    @LoadBalanced
    public WebClient.Builder buildWebClientBuilder() {

        return WebClient.builder();
    }
}


@RestController
@RequestMapping("/groups")
public class Controller {

    private final Logger logger = LogManager.getLogger();

    @Autowired
    private WebClient.Builder webClientBuilder;

private int getMinimumNumberOfPlayers(int gameId) {

        try {
            return webClientBuilder.build()
                    .get()
                    .uri("http://game-service/games/minimumNumberOfPlayers/2")
                    .retrieve()
                    .bodyToMono(Integer.class)
                    .block();
        } catch (NullPointerException|WebClientResponseException e) {
            e.printStackTrace();
            return 0;
        }
    }

...

// foo() frontend calls foo(). foo it's using getMinimumNumberOfPlayers


getMinimumNumberOfPlayers() 用于 Group 的 foo() 方法。它应该通过 id 检索游戏的最小玩家数量,但游戏微服务受 jwt 保护,并且我收到未经授权的错误。

所以我的问题是如何使组微服务能够调用游戏微服务。

谢谢。

编辑:RestTemplate Interceptor 我就是这样解决的。

最佳答案

即使我有一些安全问题,我也会回答这个问题:

你可以做的是:

  1. 为 Group 服务上的传入调用添加拦截器,该拦截器会将 JWT 存储在请求上下文中。
  2. 为游戏服务的传出调用添加一个拦截器,该拦截器将获取请求上下文中的 JWT 并将其添加到请求 header 中。

这里重要的是请求上下文

关于java - 如何从另一个 Java 微服务使用 JWT 安全微服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60864832/

相关文章:

java - @JsonProperty 未按预期工作

spring - 将 spring boot war 部署到 tomcat 中

java - 运行时重新安排 @scheduled cron 表达式,无需重新启动应用程序

java - boolean 函数返回无值

java - 如何获取 Google 返回的 JSON 对象中的持续时间和距离?

java - 使用 JaxB 编码时如何避免添加特定元素/值

java - 如何按一定顺序运行Spring Batch作业(Spring Boot)?

java - Spring数据存储库中的正确继承

java - 使用 FormDataMultiPart 发送实体和文件

java - Axon:创建聚合后在 Saga 中创建并保存另一个聚合