使用JdbcOauth2AuthorizedClientService在Spring Security 5中持久化OAuth2AuthorizedClient时出错

bxfogqkk  于 2023-01-04  发布在  Spring
关注(0)|答案(1)|浏览(132)

我尝试使用JdbcOauth2AuthorizedClientService来持久化授权的客户端信息,如access_tokenrefresh_token在一个无状态的微服务。我得到下面的错误,我从来没有得到解决所需的资源和授权的客户端信息从来没有得到保存在Postgres中。
[invalid_token_response]尝试检索OAuth 2.0访问令牌响应时出错:500内部服务器错误:"{"时间戳":1672302575797,"状态":500,"错误":"内部服务器错误","异常":"org. glassfish. jersey. server. internal. process.可Map异常","消息":"java. lang.非法参数异常:不支持的内容类型:应用程序/json ",路径":"/oauth2-v1/oauth2/令牌"}"

有趣的是,当我使用InMemoryOAuth2AuthorizedClientService实现时,OAuth2流工作正常。错误消息看起来与JDBC/DB连接无关。
我决定按照answer使用此实现
对于表oauth2_authorized_client,我使用的是Postgres模式版本:

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 bytea 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 bytea DEFAULT NULL,
  refresh_token_issued_at timestamp DEFAULT NULL,
  created_at timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,
  PRIMARY KEY (client_registration_id, principal_name)
);

我尝试了以下方法:
1.阅读LobHandler接口文档,其中指出不同的数据库驱动程序在BLOB数据类型处理方面的行为不同,因此在我的情况下,对于Postgres,他们建议:

  • 使用wrapAsLob = true创建DefaultLobHandler
vyswwuz2

vyswwuz21#

我可以通过以下方法解决此问题:

  • 我没有提到的一个小细节是,我在项目中使用LiquidBase进行模式迁移,因此Liquibase Sping Boot 自动配置会根据模式定义YAML/XML自动为我创建模式。
  • 我删除了以前创建的表oauth2_authorized_client
  • 我更改了我的LiquiBase模式定义以删除access_token_value-〉NOT NULL约束,并使用DEFAULT NULL(与refresh_token_value相同)。
  • 我再次运行应用程序,这一次它的工作

显然,JdbcOauth2AuthorizedClientService试图在流中的某个点插入access_token_value为null的条目...

相关问题