如何在 spring 启动时将经过身份验证的请求发送到另一个服务

How to send authenticated request to another service in spring boot

我有 3 个服务 1 个身份验证服务(例如服务 A)和其他 2 个服务(例如服务 B 和服务 C)使用相同的身份验证 A 服务。

我在服务 B 中有这样的方法

@PostMapping("/update-account")
    public ResponseEntity<Object> updateAccount(HttpServletRequest request,
                                                OAuth2Authentication principal,
                                                @RequestBody UpdateAccountDto updateAccountDto){


}

在这个方法中,我调用了其他方法,我有一些逻辑,最后我想使用 restTemaplte 调用服务 C 的端点,就像这样

String serviceBEndpoint= "localhost:8090/testapi/updateAccount";
        URI serviceUri = UriComponentsBuilder.fromUriString(changeEmailUri)
                .build()
                .toUri();

        HttpHeaders headers = new HttpHeaders();
        headers.set("someheader", someheader);

        HttpEntity<UpdateUserDto> request = new HttpEntity<>(updadteUserDto, headers);
        restTemplate.postForEntity(serviceUri, request, AuthenticationSuccessDto.class);

用户使用正确的令牌调用了服务 B 的端点(请求已通过身份验证),并且从服务 B 调用服务 C 也是合法的,因为请求已通过身份验证,那么我该如何以正确的方式做到这一点?

对于同一家公司所有的微服务,最常见的方法是这样的:

  • 客户端对用户进行身份验证并获得有权调用服务 B 和 C 的访问令牌

  • 因此,访问令牌可能具有范围 B 和 C - 或类似的范围 - 与这些服务的业务相关

  • 客户端调用服务 B 并在 HTTP 授权中包含访问令牌 header

  • 这意味着服务 B 可以将令牌转发给服务 C,再次在 HTTP 授权中 header,服务 C 将接受它,因为它包含范围 C。看起来像您的 Rest 模板上面的代码设置得很好,可以启用此功能。

  • 服务 B 和 C 都需要以标准方式验证访问令牌 - 有关示例,请参见 these guides

这篇 Scope Best Practices 文章中有关于此模式的更多信息。