我正在尝试实现 client_credentials 授予以在我的 Spring Boot 资源服务器中获取令牌。
我在用Auth0作为授权服务器。他们似乎需要在请求正文中添加一个名为“audience”的额外参数。
我尝试通过邮递员提出请求并且它有效。我现在正尝试在 Spring 中重现它。这是工作邮递员的请求
curl -X POST \
https://XXX.auth0.com/oauth/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=client_credentials&audience=https%3A%2F%2Fxxxxx.auth0.com%2Fapi%2Fv2%2F&client_id=SOME_CLIENT_ID&client_secret=SOME_CLIENT_SECRET'
我面临的问题是我无法将缺少的受众参数添加到令牌请求中。
我在 application.yml 中定义了一个配置
client:
provider:
auth0:
issuer-uri: https://XXXX.auth0.com//
registration:
auth0-client:
provider: auth0
client-id: Client
client-secret: Secret
authorization_grant_type: client_credentials
auth0:
client-id: Client
client-secret: Secret
我的网络客户端过滤器是这样配置的。
@Bean
WebClient webClient(ReactiveClientRegistrationRepository clientRegistrations,
ServerOAuth2AuthorizedClientRepository authorizedClients) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2 = new ServerOAuth2AuthorizedClientExchangeFilterFunction(
clientRegistrations, authorizedClients);
oauth2.setDefaultClientRegistrationId("auth0");
return WebClient.builder()
.filter(oauth2)
.build();
}
我正在注入实例并尝试发出请求以通过电子邮件获取用户
return this.webClient.get()
.uri(this.usersUrl + "/api/v2/users-by-email?email={email}", email)
.attributes(auth0ClientCredentials())
.retrieve()
.bodyToMono(User.class);
按照我的理解,过滤器拦截此 userByEmail 请求,并在执行之前尝试执行 /oauth/token 请求以获取 JWT Bearer 令牌,它可以将其附加到第一个请求并执行它。
有没有办法向过滤器添加参数?由于它是反应性的,因此很难逐步完成它并弄清楚参数到底附加在哪里,而且在这方面我还很陌生。甚至一些指向何处查找的指示也会有所帮助。