使用 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实现单点登录

如何在 Spring Boot 中将 keycloak 与不同的上下文根和反向代理集成

使用 Spring Security 3.0.2 进行 OpenId 身份验证和自动注册