如何从另一个微服务 Java 使用 JWT 安全微服务
Posted
技术标签:
【中文标题】如何从另一个微服务 Java 使用 JWT 安全微服务【英文标题】:How to consume a JWT secured microservice from another microservice Java 【发布时间】:2020-07-06 22:37:31 【问题描述】:我的应用程序有几个微服务,包括:Auth、Game 和 Group。 当我按下前端(播放)上的按钮时,我正在调用 Group rest api 方法,比如说 foo()。 为了在 Group 中实现 foo(),我需要 GET 调用 Game rest api,但它是安全的。
当我登录 React 应用程序时,我从 /login (Auth) 获取 JWT 令牌并将其存储在本地存储中。然后我成功地使用它从 Group 调用 foo() 但在 foo() 实现中我还需要使用 jwt 令牌才能从 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 安全的,我得到一个未经授权的错误。
所以我的问题是如何让 Group 微服务能够调用 Game 微服务。
谢谢。
编辑:RestTemplate Interceptor 我就是这样解决的。
【问题讨论】:
这通常不是您实现系统到系统通信的方式。例如,Oauth 对用户到系统和系统到系统的通信有不同的流程。 【参考方案1】:即使我有一些安全问题,我也会回答这个问题:
你可以做的是:
-
为您的 Group 服务上的传入呼叫添加一个拦截器,它将 JWT 存储在
request context
中。
为您的游戏服务的传出调用添加一个拦截器,该拦截器将获取 request context
中的 JWT 并将其添加到请求标头中。
这里重要的是request context
。
【讨论】:
以上是关于如何从另一个微服务 Java 使用 JWT 安全微服务的主要内容,如果未能解决你的问题,请参考以下文章
如何给运行在 SAP BTP 上的 Java 微服务增添访问控制功能
微服务 - 如何使用 JWT 对单独的 API 微服务进行身份验证