- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 client_credentials 从 react 性资源服务器访问另一个受 oauth2 保护的资源。我使用颁发的 token 访问资源服务器的部分正在运行,但没有使用 webclient 调用其他资源。
使用 UnAuthenticatedServerOAuth2AuthorizedClientRepository 我得到 serverWebExchange must be null
,使用 AuthenticatedPrincipalServerOAuth2AuthorizedClientRepository 我得到 principalName must be null
。
使用 https://www.baeldung.com/spring-webclient-oauth2只要我将客户端称为 CommandLineRunner
,它就可以工作。我在 stackoverflow 上找到的其他建议都没有用。
我在这里错过了什么?我正在使用 Spring Security 5.2.0 和 Spring Boot 2.2.0。
客户端配置:
@Configuration
public class ClientSecurityConfig {
// UnAuthenticatedServerOAuth2AuthorizedClientRepository version
@Bean
WebClient webClient(ReactiveClientRegistrationRepository clientRegistrations) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, new UnAuthenticatedServerOAuth2AuthorizedClientRepository());
return WebClient.builder()
.filter(oauth)
.build();
}
@Bean
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider(CustomClientConfig clientConfig) {
return ReactiveOAuth2AuthorizedClientProviderBuilder.builder()
.clientCredentials(clientCredentialsGrantBuilder ->
clientCredentialsGrantBuilder.accessTokenResponseClient(new CustomClient(clientConfig))) // Used to send extra parameters to adfs server
.build();
}
// AuthenticatedPrincipalServerOAuth2AuthorizedClientRepository version
@Bean
WebClient webClient(ReactiveOAuth2AuthorizedClientManager authorizedClientManager) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
return WebClient.builder()
.filter(oauth)
.build();
}
}
@Bean
ReactiveOAuth2AuthorizedClientManager authorizedClientManager(
ReactiveClientRegistrationRepository clientRegistrationRepository,
ServerOAuth2AuthorizedClientRepository authorizedClientRepository, CustomClientConfig clientConfig) {
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider =
ReactiveOAuth2AuthorizedClientProviderBuilder.builder()
.clientCredentials(clientCredentialsGrantBuilder ->
clientCredentialsGrantBuilder.accessTokenResponseClient(new CustomClient(clientConfig))) // Used to send extra parameters to adfs server
.build();
DefaultReactiveOAuth2AuthorizedClientManager authorizedClientManager =
new DefaultReactiveOAuth2AuthorizedClientManager(clientRegistrationRepository, authorizedClientRepository);
authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
return authorizedClientManager;
}
}
资源服务器配置:
@EnableWebFluxSecurity
class ResourceServerConfig {
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http
.authorizeExchange(exchanges ->
exchanges
.pathMatchers("/actuators/**", "/api/v1").permitAll()
.pathMatchers("/api/v1/**").hasAuthority("SCOPE_read")
.anyExchange().authenticated()
)
.formLogin().disable()
.httpBasic().disable()
.oauth2Client(withDefaults())
.oauth2ResourceServer().jwt();
return http.build();
}
@RestController()
@RequestMapping("/api/v1")
static class Ctrl {
final static Logger logger = LoggerFactory.getLogger(Ctrl.class);
final WebClient webClient;
public Ctrl(WebClient webClient) {
this.webClient = webClient;
}
@RequestMapping("protected")
Mono<JsonNode> protected(@RequestParam String data) {
return webClient.post()
.uri("https://other-oauth2-protected-resource")
.attributes(clientRegistrationId("myclient"))
.bodyValue("{\"data\": \"" + data + "\"}")
.retrieve()
.bodyToMono(JsonNode.class);
}
}
}
应用程序.yml:
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://adfsserver.com/adfs/services/trust
jwk-set-uri: https://adfsserver.com/adfs/discovery/keys
client:
registration:
myclient:
provider: adfs
client-id: <client-id>
client-secret: <client-secret>
authorization-grant-type: client_credentials
scope: read
provider:
adfs:
token-uri: https://adfsserver.com/adfs/oauth2/token
jwk-set-uri: https://adfsserver.com/adfs/discovery/keys
最佳答案
这最近已由 Spring 项目贡献者修复,作为此 PR 的一部分但不幸的是,官方 Spring 文档尚未更新。
正常的 servlet 方法文档是 here如果您更喜欢选择“响应式(Reactive)”方法,那么配置 webclient 只需要两个 bean:
@Bean
public ReactiveOAuth2AuthorizedClientManager authorizedClientManager(
ReactiveClientRegistrationRepository clientRegistrationRepository,
ReactiveOAuth2AuthorizedClientService authorizedClientService) {
ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider =
ReactiveOAuth2AuthorizedClientProviderBuilder.builder()
.clientCredentials()
.build();
AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager authorizedClientManager =
new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager(
clientRegistrationRepository, authorizedClientService);
authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
return authorizedClientManager;
}
@Bean
public WebClient webClient(ReactiveOAuth2AuthorizedClientManager authorizedClientManager) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
return WebClient.builder().filter(oauth).build();
}
可以引用我的Github Gist它具有所有必需的配置。
关于spring-boot - 如何使用 client_credentials 从资源服务器访问另一个 oauth2 资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58595062/
我正在尝试使用 Postman 工具从 Microsoft Graph API 获取 accessToken。我正在使用 Type=oauth2.0 的 Authorization 选项卡中尝试它,以
我的应用程序使用 preauthentication 我想使用 ClientCredentialsResourceDetails(签名提取)使用 OAuth2 protected 资源。 当将此与预身
对于一个项目,我需要显示存储在个人 OneDrive 上的一些文件。 我无法使用经典的 OAuth2 身份验证,我需要作为应用程序而不是用户进行身份验证,如本页所述:https://learn.mic
我已经使用 OAuth2 创建了一个授权服务器,目前,我可以在调用时获得不记名 token : POST /oauth/token?grant_type=client_credentials&
对于一个项目,我需要显示存储在个人 OneDrive 上的一些文件。 我无法使用经典的 OAuth2 身份验证,我需要作为应用程序而不是用户进行身份验证,如本页所述:https://learn.mic
我最近为我的 OAuth2 提供程序实现了 client_credentials 授予,它基于 Spring security OAuth2。然后我转移到客户端来实现该机制。我添加了 @EnableO
我的问题是针对 spring-security 5.1.0 和使用 Spring WebClient 的。我在使用 Spring Boot 2.1.0 的服务器环境中工作。这question可能已经被
我正在尝试使用 Spring Boot 创建仅支持客户端凭据流的 OAuth2 授权。据我了解该流程,客户端直接访问 /oauth/token 端点。 有没有办法在 Spring Boot 中禁用 /
我正在尝试使用 ResourceServerConfigurerAdapter(使用 Oauth2 client_credentials)访问受 Spring Security 保护的 Web 服务
我有一些 API 需要访问 token 才能获得响应。在 postman 中,我们使用 OAuth 2.0 通过提供客户端用户名和密码来获取访问 token 。以类似的方式,我想获取新的访问 toke
我想使用 client_credentials 从 react 性资源服务器访问另一个受 oauth2 保护的资源。我使用颁发的 token 访问资源服务器的部分正在运行,但没有使用 webclien
我正在阅读 OAuth2 规范: https://www.rfc-editor.org/rfc/rfc6749#section-4.4.2 特别是关于 client_credentials 的部分授予
我一直在尝试获取用于 oauth2 身份验证的 token ,以使用以下 Java 代码连接到邮件服务器: public static String getAuthToken(String tenan
我一直在尝试获取用于 oauth2 身份验证的 token ,以使用以下 Java 代码连接到邮件服务器: public static String getAuthToken(String tenan
我想使用 OAuth2 和 Symfony2(实际上是 Symfony3)为我的 API 进行服务器到服务器身份验证。我正在使用 FOSOAuthServerBundle 。 远程服务器不会代表任何用
我的 axios POST 方法无法正常工作。虽然调用语法似乎是正确的,但我想在我的具体情况下存在一些根深蒂固的问题。我正在尝试使用 grant_type=client_credentials 获取访
我正在尝试在 REST API 上注册新用户,请求应该是这样的: POST /api/oauth/token HTTP/1.1 Content-Type: application/x-www-form
我在 google 控制台中创建了一个 clientid 和 clientcredentials。当我使用 grant_type=client_credentials 请求 token 时。我得到了
我正在尝试将 OAuth client_credentials 与 Windows Microsoft Azure 结合使用。我可以成功生成 access_token 但当我尝试访问 https://
我想了解 grant_type=client_credentials 之间的区别和 grant_type=password在Authentication或在 OAuth2 Flow概念。 我正在关注以
我是一名优秀的程序员,十分优秀!