首页 > 解决方案 > 从查询参数动态设置注册 id

问题描述

当调用端点时,我有以下控制器来获取注册 ClientA。


@GetMapping("/token")
   fun token(
      @RegisteredOAuth2AuthorizedClient("clientA") authorizedClient: OAuth2AuthorizedClient
   ): ResponseEntity<String> {
         val token = tokenService.getToken()
         return ResponseEntity(token, HttpStatus.OK)
   }

我想让客户端作为一个query param并动态启动 OAuth2 进程。我怎样才能实现它?像下面这样的东西:

@GetMapping("/token?client={client}")
   fun token(
      @RegisteredOAuth2AuthorizedClient(${client}) authorizedClient: OAuth2AuthorizedClient
   ): ResponseEntity<String> {
         val token = tokenService.getToken()
         return ResponseEntity(token, HttpStatus.OK)
   }

标签: spring-security

解决方案


我的解决方案是使用default authorization urianddefaultSuccessUrl("/token")

目标是轻松扩展客户端,此解决方案可以实现相同的目标。

解决方案:

  1. 注册clientA_application.yml
               clientA:
                  client-id: Any
                  redirect-uri: http://localhost/index
                  provider: clientA-provider
                  scope: launch
                  client-name: clientA
                  client-authentication-method: none
                  authorization-grant-type: authorization_code
  1. 现在端点/oauth2/authorization/clientA是由 spring security 自动创建的。要获取令牌,请调用上面的 url。

/token成功授权后,由于 defaultSuccessUrl("/token") ,端点转到。

下面显示了相关的代码片段:

override fun configure(http: HttpSecurity) {
      http.csrf()
         .disable()
         .oauth2Login()
         .authorizationEndpoint()
         .and()
         .tokenEndpoint()
         .and()
         .defaultSuccessUrl("/token")
@Controller
@RequestMapping("/token")
class LaunchController(private val tokenService: TokenService) {

   @GetMapping
   fun token(): ResponseEntity<String> {
         val token = tokenService.getToken()
         return ResponseEntity.ok(token)

   }
}

推荐阅读