我尝试使用JdbcOauth2AuthorizedClientService
来持久化授权的客户端信息,如access_token
和refresh_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
1条答案
按热度按时间vyswwuz21#
我可以通过以下方法解决此问题:
LiquidBase
进行模式迁移,因此Liquibase
Sping Boot 自动配置会根据模式定义YAML/XML
自动为我创建模式。oauth2_authorized_client
access_token_value
-〉NOT NULL
约束,并使用DEFAULT NULL
(与refresh_token_value
相同)。显然,
JdbcOauth2AuthorizedClientService
试图在流中的某个点插入access_token_value
为null的条目...