oauth2.0 在OpenAPI生成器生成的Java WebClient代码中沿着授权标头

83qze16e  于 2022-12-26  发布在  Java
关注(0)|答案(2)|浏览(183)

我有一个基于Java/Spring的微服务架构,它有两个服务:

  • A-有一个面向公众的端点,它执行一些操作,然后调用B上的以下端点。此端点需要一个授权标头(OAuth2)来标识用户。
  • B-有一个端点,该端点也需要一个Authorization标头(OAuth2),以便它可以确定哪个用户进行了调用。

我已经使用OpenAPI指定了B的端点。我正在使用OpenAPI Generator生成A中的客户端(Spring WebClient)和B中的服务器(Spring Boot)。
我的问题是:要将Authorization报头从A传递到B,需要执行什么操作?我知道如何设置静态报头,但不知道如何根据A接收到的内容传递报头。
与此问题类似,但对于WebClient:OpenAPI client generator Java - header per call

zy1mlcev

zy1mlcev1#

由于您的A服务是一个资源服务器,并且您希望代表向A发起请求的用户向服务B发出请求,我只需要在WebClient上设置一个BearerAuthorization报头,该报头包含从当前安全上下文中检索到的原始访问令牌字符串(使用SecurityContextHolder静态访问器,或者让Spring自动注入AbstractOAuth2TokenAuthenticationToken<?> auth作为@Controller方法参数)。
如果您的A服务是一个客户端,您可以像我在this tutorialUiController中所做的那样。

1l5u6lss

1l5u6lss2#

原来我的问题是如何在OpenAPI规范中指定端点安全性。
我补充道:

components:
  securitySchemes:
    s2s:
      type: oauth2
      flows:
        clientCredentials:
          authorizationUrl: https://example.com/oauth/authorize
          tokenUrl: https://example.com/oauth/token
          scopes:
            read: Read scope

并在我端点上引用了该安全架构:

/foo:
    get:
      ...
      security:
        - s2s:
            - read

现在,当我在这个模式上运行openapi-generate并在Spring Boot(服务器)或Java WebClient(客户机)上生成它时,生成的端点签名看起来像这样:

@RequestMapping(
        method = RequestMethod.GET,
        value = "/foo",
        produces = { "application/json" }
    )
    Mono<ResponseEntity<MyResponse>> foo(
        @Parameter(name = "Authorization", description = "", required = true) @RequestHeader(value = "Authorization", required = true) String authorization,
        @Parameter(hidden = true) final ServerWebExchange exchange
    );

这个方法的参数String authorization之前没有生成,这正是我在这里需要的,它允许我把A的头传递给B的调用。
支持@Ch4mp在这里帮忙。

相关问题