我的应用程序有多个微服务,包括: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 我就是这样解决的。
最佳答案
即使我有一些安全问题,我也会回答这个问题:
你可以做的是:
- 为 Group 服务上的传入调用添加拦截器,该拦截器会将 JWT 存储在
请求上下文
中。 - 为游戏服务的传出调用添加一个拦截器,该拦截器将获取
请求上下文
中的 JWT 并将其添加到请求 header 中。
这里重要的是请求上下文
。
关于java - 如何从另一个 Java 微服务使用 JWT 安全微服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60864832/