将 JWT 令牌从一个 SPRING API 传递到另一个的最佳方法

Posted

技术标签:

【中文标题】将 JWT 令牌从一个 SPRING API 传递到另一个的最佳方法【英文标题】:Best way to PASS JWT tokens from one SPRING API to another 【发布时间】:2020-10-09 02:30:02 【问题描述】:

我喜欢听取 SO 用户的建议,以找到解决此问题的最佳方法。

我使用一个身份管理器(支持 openid-connect)、一个前端客户端(别名 FE)、一个 BFF(别名 BFF)和两个用 spring 和 spring boot re 编写的后端 API。我的要求是这样的;

    FE 重定向到 IDM - 成功后获取 JWT 令牌 验证。 JWT 也有正确的声明,并且 发现 URL 也具有用于验证 JWT 令牌的公钥。 FE 通过 BFF 调用 API BFF 调用 API-1,而后者又调用 API-2。 API-2 应验证登录用户以确保“经理”授权与 JWT 令牌相关联

上面的 API-1 和 API-2 是两个 Spring API,对于这个问题,我假设 BFF 将 jwt 令牌传递给 API-1,并且 API-1 也遵循推荐的流程来验证令牌。

我的问题是 API-1 在请求标头中获取令牌并使用 Spring 功能将其传递给 API-2 的推荐方法是什么。

(目前,我使用线程本地来促进这一点,即在请求过滤器中,我将接收到的标头添加到线程本地,然后它执行其逻辑并在调用 API-2 时获取标头线程本地空间并将其传递给 API-2。我非常怀疑这是推荐的方法...)

【问题讨论】:

谁能帮忙解决这个问题? :( 这个问题还不够清楚吗?或者这是我在生产设置中不应该做的事情? 在我们当前的项目设置中,FE 将登录请求传递给 openid 连接提供程序并获取 JWT。然后 FE 调用 BE,将 JWT 作为 Authorization 标头中的不记名令牌传递。在我们的案例中,所有 BE 调用都通过我们的 api 网关进行,该网关使用 JWKS 验证 JWT。 非常感谢您的回答 - 但这意味着 API 网关也会因所有内部请求而过载?我也考虑过这个问题——但对此持怀疑态度,因为它会回到 API 网关,而我们实际上有 jwt 上的所有细节要授权。 好的,我想我明白你在说什么。是的,即使对我们来说,api 之间的内部调用也不通过网关。但即使是这样,并且如果您必须在 api 之间传递 JWT,为什么不使用标准 Authorization 标头并将其作为不记名令牌在调用第二个 api 的其余端点时发送。 嗨,安娜。我现在这样做。正如我所提到的,我实际上使用线程本地来执行此操作并将 JWT 保存在本地线程上,然后将其传递给其他 api。但是,这是我可以接受的做法吗?它变得很麻烦,因为我有一个服务也调用 8-10 个其他服务。再次感谢您的评论。 【参考方案1】:

我的问题是 API-1 在请求标头中获取令牌并将其传递给 API-2 的推荐方法是什么

可以将请求头指定为服务方法参数

example

@GetMapping("/greeting")
public ResponseEntity<String> greeting(
  @RequestHeader("Authorization") String authnHeader) 

您可以使用 RequestTemplate 将 Authorization 标头值传递给后端调用。

发布example2

MultiValueMap<String, String> headers = new 
LinkedMultiValueMap<String, String>();
headers.add("Authorization", authnHeader);
headers.add("Content-Type", "application/json");

RestTemplate restTemplate = new RestTemplate();

HttpEntity<ObjectToPass> request = new 
HttpEntity<ObjectToPass>(objectToPassInstance, headers);

restTemplate.postForObject(urlPost, request, Boolean.class);

【讨论】:

以上是关于将 JWT 令牌从一个 SPRING API 传递到另一个的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

spring boot - 假装客户端发送基本授权标头|将 jwt 令牌从一个微服务传递到另一个微服务

PHP:如何使用 JWT 从 API 注销

Golang REST API - 从经过验证和解码的令牌传递信息

在每个 API 请求中传递 JWT 令牌

在 Rest API 中传递 JWT 令牌

传递 JWT 令牌以访问 API