Spring Boot Oauth2 客户端(反应式)双向 TLS/SSL 令牌 uri

2023-11-29

弹簧靴2.3.x 和 Spring 5.x 最近添加了对基于以下配置的反应式 oauth2 客户端的支持网络客户端 class.

我需要客户端凭据授予流程配置

在没有相互 TLS/SSL 的情况下执行此调用非常简单。

正常(无 TLS/SSL)配置(@Configuration)代码摘录如下:-

@Bean
public ReactiveOAuth2AuthorizedClientManager authorizedClientManager(
        ReactiveClientRegistrationRepository clientRegistrationRepository,
        ServerOAuth2AuthorizedClientRepository authorizedClientRepository){

    ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider = ReactiveOAuth2AuthorizedClientProviderBuilder.builder()
            .clientCredentials()
            .build();

    DefaultReactiveOAuth2AuthorizedClientManager authorizedClientManager = new DefaultReactiveOAuth2AuthorizedClientManager(clientRegistrationRepository, authorizedClientRepository);

    authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
    return authorizedClientManager;
}

@Bean("testClient")
public WebClient webClient(ReactiveOAuth2AuthorizedClientManager authorizedClientManager,
                           @Value("${test.client.base.url}") String baseUrl) {
    ServerOAuth2AuthorizedClientExchangeFilterFunction oauthFunction = new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
    oauthFunction.setDefaultClientRegistrationId("local");
    return WebClient.builder()
            .baseUrl(baseUrl)
            .filter(oauthFunction)
            .build();
}

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http.oauth2Client();
    return http.build();
}

属性文件

spring.security.oauth2.client.registration.local.authorization-grant-type=client_credentials
spring.security.oauth2.client.registration.local.client-id=client_id
spring.security.oauth2.client.registration.local.client-secret=client_secret

spring.security.oauth2.client.provider.local.token-uri=http://hostname:port/oauth/token
test.client.base.url=http://protected-resource/v1/apis

但是通过相互 TLS(客户端证书)调用 oauth2 授权服务器是一件大事。

怎么做?我想与社区分享相同的内容,并在下面亲自回答相同的问题


需求的答案和主要变化将在 bean 中authorizedClientManager

答案的范围只是客户端凭据授予流程,尽管其他 oauth2 授予流程的更改应该类似,这也会有所帮助。

@Bean
public ReactiveOAuth2AuthorizedClientManager authorizedClientManager(
        ReactiveClientRegistrationRepository clientRegistrationRepository,
        ServerOAuth2AuthorizedClientRepository authorizedClientRepository){

    // construct client credential token response client yourself
    WebClientReactiveClientCredentialsTokenResponseClient accessTokenResponseClient = new WebClientReactiveClientCredentialsTokenResponseClient();

    // construct the sslContext as per your needs and inject in below
    // and create httpClient by injecting your sslContext here
    HttpClient httpClient = HttpClient.create()
            .tcpConfiguration(client -> client.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000))
            .secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));

    ClientHttpConnector httpConnector = new ReactorClientHttpConnector(httpClient);

    accessTokenResponseClient.setWebClient(WebClient.builder().clientConnector(httpConnector).build());

    ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider = ReactiveOAuth2AuthorizedClientProviderBuilder
            .builder()
            .clientCredentials(c -> {
                c.accessTokenResponseClient(accessTokenResponseClient);
            }).build();

    DefaultReactiveOAuth2AuthorizedClientManager authorizedClientManager = new DefaultReactiveOAuth2AuthorizedClientManager(clientRegistrationRepository, authorizedClientRepository);

    authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
    return authorizedClientManager;
}

如果你看到这条线.secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));

您需要构造 sslContext 并注入相同的内容,这完全取决于您的代码设置。

有关详细代码和说明,您可以访问链接here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot Oauth2 客户端(反应式)双向 TLS/SSL 令牌 uri 的相关文章

随机推荐

  • 将二维数组中每行的 null 元素移动到该行的末尾

    假设我有一个二维数组 如下所示 O X null O O null null null null O null null O O 我希望它看起来像这样 O X O O null null null O O O null null null
  • 使用 Location 标头和 jQuery 在 POST 后重定向

    我想使用重定向到目标Location带有 jQ uery 1 7 的标头 我的代码看起来像这样 creationLink click function ajax type POST url success function data tex
  • gnuplot 错误:格式字符错误

    我是 gnuplot 新手 但迫切需要使用它 这是我使用的以下命令集 set terminal latex set output conflict tex set xtics random 2 sharing 0 3 sharing 10
  • 如何显示“打开方式”文件对话框?

    有没有简单的方法来打开 打开方式 文件对话框 使用 ProcExp 进行的一些逆向工程揭示了一个有效的 rundll32 exe 命令行 这是使用它的示例程序 using System using System Diagnostics us
  • 在 R 中有效地创建向量的排列

    我正在研究一种在 R 中有效创建向量混乱 以及相反的特定排列 的方法 据我所知 没有基本函数可以做到这一点 而且这里也没有太多关于它的内容 一个明显的开始是sample它创建了一个向量的排列 但我需要这个排列没有固定点 因此是向量的混乱 有
  • 在 CSS FlexBox 布局中自动调整图像大小并保持宽高比?

    我使用了 CSS 弹性框布局 如下所示 如果屏幕变小 就会变成这样 问题是图像没有调整大小 保持原始图像的纵横比 如果屏幕变小 是否可以使用纯 CSS 和弹性框布局来调整图像大小 这是我的html div class content div
  • 如何克隆Python生成器对象?

    考虑这种情况 usr bin env python coding utf 8 import os walk os walk home for root dirs files in walk for pathname in dirs file
  • 如何限制用户或应用程序使用大页面支持?

    我们部署和使用 内部自行开发的应用程序 所有这些实际上都使用大页面和mmap 系统调用 但我更愿意限制某些应用程序实际使用大页面支持 这可以通过代码的任何更改或任何可以实现的系统范围的配置选项来实现吗 我建议设置和使用内核可调选项vm hu
  • 从 UIMenuController 中删除复制、查找和共享

    我正在尝试覆盖默认值UIMenuController这样 当用户在其文本视图中选择文本时 仅出现我的自定义项 定义 到目前为止 我在网上找到的方法并没有太多运气 更具体地说 我将UIViewController并使用canPerformAc
  • Accepts_nested_attributes_for 和Belongs_to 多态

    我想与建立多态关系accepts nested attributes for 这是代码 class Contact
  • Xcode - OSX 错误:使用旧版运行时的平台不支持 -fobjc-arc

    我正在使用 XCode 4 6 1 和 OSX 10 8 5 我尝试编译一个项目但收到此错误 error fobjc arc is not supported on platforms using the legacy runtime Co
  • 从本机代码 (JNI/NDK) 创建、填充和返回 2D 字符串数组

    我发现这段特定的代码非常困难 尤其是因为我一周前才开始使用 C 我一直在努力寻找正确的语法来在 C 中正确创建 java 字符串数组 即 jstring 对象数组 即表示 jstring 对象数组的对象 我一直在使用以下资源 并从中构建了可
  • 检查器中显示哪种旋转?

    我的玩家的胸骨可以在瞄准时旋转 现在我想评估我应该让胸部旋转多少 最小和最大旋转 为此 我允许所有角度的旋转并查看了 Inspector 例如 胸部应可向左旋转的最小值应为Y 15 当 Y 15 在 Inspector 中看到 时 它看起来
  • React,无法读取 useEffect 的未定义错误的属性

    我试图从 API 获取一些天气数据 但总是遇到无法读取未定义属性的相同错误 我已经浏览了不同的教程和之前提出的问题 但我无法弄清楚我做错了什么 有人可以帮我一下吗 export default function Weather const
  • Entity Framework 5.0b2 Code First:同一个表的一对多和一对一,带级联删除

    经过几个小时的反复试验 我达到了这个目的thread它解释了如何使用相同的两种类型建立一对多关系和一对一关系 但是 我无法将此与级联删除一起使用 抛出 无法确定依赖项的有效顺序 运营 由于外键约束 可能存在依赖关系 模型要求 或存储生成的值
  • Android 上 chrome 25 中的语音输入

    在运行 chrome 25 非测试版 的 PC 上 显示一个麦克风图标 单击它会提示输入 当我停止说话时 我的警报呼叫就会执行 都好 在运行 chrome 25 非测试版 且运行 Android 4 04 的 Galaxy Note 智能手
  • 如何使用 Regex.Replace 一次替换两个字符串?

    我有以下方法可以替换文件名中的 井号 符号 但我还希望能够同时替换 单撇号 我该怎么做 这是文件名的值 提供商许可证 A R Ab acus Settlements 1 11 09 xls static string removeBadCh
  • Rust 中低级数据结构和类型转换的位域和联合

    我需要管理位域数据和联合 这是我在 C 中想到的代码 typedef struct attribute packed union struct attribute packed unsigned short protocol 4 unsig
  • 如何查看 pytest 运行期间创建的正常打印输出?

    有时我只想在代码中插入一些打印语句 然后看看当我执行它时会打印出什么 我通常的 练习 方法是使用现有的 pytest 测试 但是当我运行这些时 我似乎看不到任何标准输出 至少在我的 IDE PyCharm 中 有没有一种简单的方法可以在 p
  • Spring Boot Oauth2 客户端(反应式)双向 TLS/SSL 令牌 uri

    弹簧靴2 3 x 和 Spring 5 x 最近添加了对基于以下配置的反应式 oauth2 客户端的支持网络客户端 class 我需要客户端凭据授予流程配置 在没有相互 TLS SSL 的情况下执行此调用非常简单 正常 无 TLS SSL