将 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 令牌从一个微服务传递到另一个微服务