Spring Security 5:保留并访问 Oauth2 刷新令牌

2023-12-29

我的 Spring Boot 客户端应用程序如何访问由例如提供的刷新令牌谷歌在 Spring Security 5 中?

很简单的问题。远程授权服务器(例如 Google)发送刷新令牌,我想使用它。在 Spring Security 5 中保存和检索它的最佳方法是什么?

它似乎这个答案 https://stackoverflow.com/questions/39779134/spring-oauth2-how-to-refresh-access-token, 这个问题 https://stackoverflow.com/questions/54513209/how-to-renew-access-token-with-the-refresh-token-in-oauth2-in-spring, and 这个外部链接 https://javadeveloperzone.com/spring-boot/spring-boot-oauth2-jdbc-token-store-example/描述自从 Oauth2 成为 Spring Security 5 中的一等公民以来不再兼容的方法。

Context:

刷新令牌允许客户端应用程序在用户会话过期后继续访问资源。根据谷歌的文档 https://developers.google.com/identity/protocols/oauth2#scenarios,刷新令牌应该是持久的:

应用程序应存储刷新令牌以供将来使用,并使用访问令牌来访问 Google API。

Spring Security 使得访问令牌以一种广泛可用的形式OAuth2身份验证令牌 https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/oauth2/client/authentication/OAuth2AuthenticationToken.html,但刷新令牌不包含在那里。

刷新令牌也不可用OidcUserService(或覆盖它的类),因为public OidcUser loadUser(OidcUserRequest userRequest)无权访问刷新令牌。这很糟糕,因为使用自定义类覆盖 OidcUserService 会很好,该类可以从 OIDC 用户详细信息中创建/检索用户并同时保存其关联的刷新令牌.

The OAuth2LoginAuthenticationFilter将刷新令牌保存在 ClientRegistrationRepository 中:

OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(
    authenticationResult.getClientRegistration(),
    oauth2Authentication.getName(),
    authenticationResult.getAccessToken(),
    authenticationResult.getRefreshToken());

this.authorizedClientRepository.saveAuthorizedClient(authorizedClient, oauth2Authentication, request, response);

默认实现将令牌保留在临时内存中,这不适合分布式应用程序或在重新启动后保持不变。

似乎有一个JdbcOauth2AuthorizedClientService https://docs.spring.io/spring-security/site/docs/current/reference/html5/#oauth2Client-authorized-repo-service, with 最近添加的文档 https://github.com/spring-projects/spring-security/commit/b42f0f50ab57186c15c57cead4ebbda75be3cdc9, and a 暗示的图式 https://docs.spring.io/spring-security/site/docs/current/reference/html5/#dbschema-oauth2-client它可能有用,但没有提供配置它或使用它检索刷新令牌的示例。

那么客户端应用程序如何在 Spring Security 5 中持久保存并访问刷新令牌呢?


JdbcOauth2AuthorizedClientService确实适合您的用例。配置非常简单。 首先,您需要将此表添加到数据库中:

CREATE TABLE oauth2_authorized_client (
  client_registration_id varchar(100) NOT NULL,
  principal_name varchar(200) NOT NULL,
  access_token_type varchar(100) NOT NULL,
  access_token_value blob NOT NULL,
  access_token_issued_at timestamp NOT NULL,
  access_token_expires_at timestamp NOT NULL,
  access_token_scopes varchar(1000) DEFAULT NULL,
  refresh_token_value blob DEFAULT NULL,
  refresh_token_issued_at timestamp DEFAULT NULL,
  created_at timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
  PRIMARY KEY (client_registration_id, principal_name)
);

然后,配置JdbcOauth2AuthorizedClientService bean:

@Bean
public OAuth2AuthorizedClientService oAuth2AuthorizedClientService
        (JdbcOperations jdbcOperations, ClientRegistrationRepository clientRegistrationRepository) {
    return new JdbcOAuth2AuthorizedClientService(jdbcOperations, clientRegistrationRepository);
}

请注意,当前的实现有一个错误,该错误将在几天后发布的 spring-security 版本 5.3.2 中得到解决。

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

Spring Security 5:保留并访问 Oauth2 刷新令牌 的相关文章

随机推荐

  • 在 Rails 中使用域逻辑回调的优点和缺点

    您认为使用领域逻辑回调的优点和缺点是什么 我是在 Rails 和 或 Ruby 项目的背景下谈论的 为了开始讨论 我想提一下来自关于回调的 Mongoid 页面 http mongoid org en mongoid docs callba
  • 从命令行在 Firefox 上安装 WebExtensions

    我找到了问题如何在脚本中从命令行安装 Firefox 插件 https askubuntu com questions 73474 how to install firefox addon from command line in scri
  • 如何在没有 UI 的情况下启动 Activity?

    是否可以在没有 UI 的情况下从主函数启动 Activity 即是否有一种方法可以围绕另一个活动创建一种 包装器 即通过启动主要活动 它会自动将您带到另一个活动 如果这是不可能的 是否有办法从堆栈中删除主要活动 以便单击后退按钮不会将您带到
  • Objective C 数组元素都以相同的值结束

    首先 如果这是一个相当基本的问题 我深表歉意 但是我是 Objective C 的新手 并且在我所有的搜索中都无法找到我的问题的答案 尽管这很可能是因为我是新手而不是新手 在寻找答案时相当使用正确的术语 我有一个简单的循环 在其中我用一些自
  • nltk 没有将 $NLTK_DATA 添加到搜索路径?

    在linux下 我设置了环境变量 NLTK DATA home user data nltk 并且爆炸测试按预期工作 gt gt gt from nltk corpus import brown gt gt gt brown words T
  • NetSuite Restlet写入性能较差

    编辑 我已经编辑了实际数字并用伪咒语替换了它们 因为我被告知共享性能数据违反了 Netsuite 的 TOS 我正在使用 Restlet 将我们的会计系统与 NetSuite 集成 总体来说 除了性能方面的明显例外之外 它运行得非常好 从性
  • 使用 Java 流打印列表项

    我可以使用类似的东西 forEach System out print 打印我的列表项 但如果我在打印之前还有其他操作要做 我就不能像这样使用它 mylist replaceAll s gt s toUpperCase forEach Sy
  • 如何将多个分区的 .gzip 文件读入 Spark Dataframe?

    我有以下分区数据文件夹 my folder part 0000 gzip part 0001 gzip part 0002 gzip part 0003 gzip 我尝试使用以下方法将这些数据读入数据帧 gt gt gt my df spa
  • 启动 Oozie 工作流程时出现问题

    我在启动 Oozie 工作流程时遇到问题 Config
  • 使用通用类库中的 Windows UWP Windows.Devices.SerialCommunication.SerialDevice

    我正在制作一个 Modbus 库 再次 这次它打算在 Windows 10 IoT Core 上运行 我遇到了一个有趣的问题 这段代码 string aqs SerialDevice GetDeviceSelector var dis aw
  • 假设的串联困境

    所以我正在为 PHP 开发一种简单的微语言 替代语法 它的语法大量借鉴了 JavaScript 和 CoffeeScript 包括一些我自己的概念 我在 PHP 中手工编写了解析器 未使用解析器生成器 将代码转换为 PHP 然后执行它 它更
  • Rmarkdown:如果列名具有用反引号定义的空格,则编写内联 dplyr 代码

    Problem 当我filter or select 具有空格的列名称 我通常在 dplyr 中使用反引号定义该空格 示例数据 r setup include FALSE knitr opts chunk set echo TRUE lib
  • Inno Setup:使用注册表部分中自定义向导页面的数据

    我想知道如何使用自定义向导页面的用户输入值 我有一个自定义页面 用户可以在其中键入 ODBC 连接数据 这是这部分的代码 ServerDataPage CreateInputQueryPage AskAuthPage ID SQL Serv
  • Django mod_wsgi apache

    当我尝试访问我的 Django 网站时http www satoshi example com mysite http www satoshi example com mysite我得到一个503 Service Temporary Una
  • 将数据从 NSOperation 传递到下一个 NSOperation

    是否可以将数据从 NSOperation 传递到依赖链以供下一个 NSOperation 使用 Thanks Chris 是的 目前的NSOperation可以通过以下方式访问其依赖项dependencies method NSArray
  • 添加 root 密码,无法访问 phpmyadmin

    使用 phpmyadmin 我将用户 root 的密码 本地主机条目和 127 0 0 1 条目 从空白更改为 password 然后我被锁定在 phpmyadmin 之外 收到 1130 错误 主机 localhost 不允许连接到此 M
  • 在页面加载时停止加载详细网格

    如何阻止 DetailGrid 在页面加载时不加载 因为我在主网格中有按钮来加载详细网格 以下是详细网格的代码 jQuery ready function jQuery list10 d jqGrid height 100 url JQSa
  • 我可以将另一个程序的窗口移动到焦点前面吗?

    我正在使用其 API 与第三方应用程序进行交互 并且希望当用户执行特定操作时将其移至焦点前面 以便它位于所有其他打开的窗口之上 虽然我可以轻松地在层次结构中上下移动应用程序 但似乎没有办法与其他窗口交互 是否可以用Java将另一个程序的窗口
  • 代理与自然键:性能差异的硬性数字?

    代理键和自然键之间存在着一场健康的争论 所以帖子 1 https stackoverflow com questions 1207983 in general should every table in a database have an
  • Spring Security 5:保留并访问 Oauth2 刷新令牌

    我的 Spring Boot 客户端应用程序如何访问由例如提供的刷新令牌谷歌在 Spring Security 5 中 很简单的问题 远程授权服务器 例如 Google 发送刷新令牌 我想使用它 在 Spring Security 5 中保