使用 Spring Boot 使用 OpenID 提供程序对 Web 应用程序进行身份验证时出错
Posted
技术标签:
【中文标题】使用 Spring Boot 使用 OpenID 提供程序对 Web 应用程序进行身份验证时出错【英文标题】:Error authenticating a web application with OpenID Provider using Spring Boot 【发布时间】:2021-10-07 06:54:22 【问题描述】:我正在尝试使用 Spring boot 2 使用第三方配置的 Open ID Connect 提供程序对 Web 应用程序进行身份验证。 输入登录凭据并提交后,在代码交换期间,我收到此错误
org.springframework.security.oauth2.core.OAuth2AuthenticationException: [invalid_token_response] An error occurred while attempting to retrieve the OAuth 2.0 Access Token Response: Could not extract response: no suitable HttpMessageConverter found for response type [class org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse] and content type [text/html]
我有点卡在这一点上。我正在关注这个博客enter link description here 下面是yaml和pom文件。
application.yml
logging:
level:
org.springframework.security: DEBUG
spring:
security:
oauth2:
client:
provider:
abc:
authorization-uri: https://xyz/oauth/authorize
token-uri: https://xyz/oauth/token
user-info-uri: https://xyz/oauth/userinfo
user-name-attribute: sub
jwk-set-uri: https://xyz/oauth/jwks/jwk-url
registration:
abc:
authorization-grant-type: authorization_code
client-id: ****
client-secret: ****
scope: openid,profile,email
redirect-uri: https://xyz/login/oauth2/code/abc
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
redirect-uri 已在服务器上注册并且工作正常,一旦我提交凭据,我就会得到代码作为响应。 交换代码时,请求处理失败。 如有任何帮助,我将不胜感激并解决此错误。
这是我的配置文件:
@Configuration
@EnableWebSecurity
@Slf4j
public class SecurityConfig extends WebSecurityConfigurerAdapter
final Logger logger = LoggerFactory.getLogger(SecurityConfig.class);
@Override
protected void configure(HttpSecurity http) throws Exception
http.cors().and().csrf().disable().authorizeRequests().antMatchers("/oauth2/**","/login/**").permitAll().anyRequest()
.authenticated().and().oauth2Login()
控制器
public class SwController
final Logger logger = LoggerFactory.getLogger(SwController.class);
@GetMapping("/user/oidc-principal")
@CrossOrigin
public OidcUser user(@AuthenticationPrincipal OidcUser principal)
return principal;
【问题讨论】:
错误消息告诉您,您从服务返回的响应很可能是网页或错误页面[text/html]
是的,看起来是这样,因为服务应该返回了一个由access_token、refresh_token等组成的json格式数据。
@Toerktumlare 我确实使用授权端点返回的代码检查了我的 /token 端点,并且它可以工作。它返回预期的 json 响应,但在 spring 中失败。
跟踪日志应该告诉你你做错了什么。
@Toerktumlare 堆栈跟踪错误,我在这篇文章中已经提到过。
【参考方案1】:
其实这里的问题不在于 Spring Boot 代码,而在于服务本身。第三方服务提供商的域有问题,导致返回 [text/html] 页面。而且由于 Spring 期望来自该服务的 application/json 响应,它找不到合适的 httpmessageconverter 来处理这个请求。
【讨论】:
以上是关于使用 Spring Boot 使用 OpenID 提供程序对 Web 应用程序进行身份验证时出错的主要内容,如果未能解决你的问题,请参考以下文章
spring boot项目之卖家扫码登陆获取openid(微信身份验证id)
Spring Boot OAuth2/OpenID Connect Client 尝试解码 Jwt: Malformed Jwk set 时出错
spring boot项目之登陆缓存session至redis和cookies
Spring Boot/Angular整合Keycloak实现单点登录