在客户端注册的令牌响应中获取 [invalid_id_token] 缺少(必需)ID 令牌:github

问题描述 投票:0回答:3

我正在使用 SpringBoot 和 Oauth2 对我的应用程序进行身份验证,目前使用 github。 如果我在 application.properties 上使用范围 oidc,则该过程工作正常,并且使用 github 进行登录。

我的问题是我想要/需要使用范围 openid 来获取 id_token。当我将 application.properties 更改为

spring.security.oauth2.client.registration.github.scope=openid

我开始收到此错误作为登录响应:

[invalid_id_token] Missing (required) ID Token in Token Response for Client Registration: github

我仍然得到

http://localhost:8080/login/oauth2/code/github?code=ABC&state=CDE
,但在那之后,错误出现了。

我的安全等级是:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{


@Override
public void configure(HttpSecurity http) throws Exception {
    http
    .authorizeRequests()
    .antMatchers("/admin").hasRole("ADMIN")
    .antMatchers("/user").hasRole("USER")
    .anyRequest().authenticated()
    .and()
    .formLogin()
    .and()
    .oauth2Login()
    ;
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
    .withUser("springuser").password(passwordEncoder().encode("spring123")).roles("USER")
    .and()
    .withUser("springadmin").password(passwordEncoder().encode("admin123"))
    .roles("ADMIN", "USER");
    }

我应该注意什么有什么线索吗?

提前致谢

spring-boot oauth-2.0
3个回答
1
投票

这个

spring.security.oauth2.client.registration.github.scope=openid

激活基于 Oauth2 构建的 OpenID Connect 身份验证。 但这不再只是 Oauth2,因为它需要该令牌。 如果 Oauth2 是您想要的,只需删除上面的行即可。

是的,这只是令人困惑,这可能就是人们避免使用 OIDC 的原因。


0
投票

我成功了!

事实证明问题不在代码上。问题出在 github oauth2 凭证上。当我使用由 Google Credentials 生成的令牌/秘密时,除了 application.properties 之外,我不需要更改任何其他内容。

关于 github 登录的谜团仍然存在,因为令牌寄存器上没有太多数据需要更改。


0
投票

我在使用自托管 Gitea 实例时遇到了这个问题,与原来的问题类似,但在 GitHub 上却没有。

默认情况下,Spring Boot(或 Spring OAuth2 客户端)在 HTTP

client_secret
标头中发送
Authorization
。一些提供商,例如 Gitea(可能还有这个问题源自的旧 GitHub 版本),不支持此方法。

设置 OAuth2 提供程序的

client-authentication-method
属性可以解决此问题:

spring.security.oauth2.client.registration.<provider>.client-authentication-method=client_secret_post

这告诉 Spring 在请求正文中而不是在标头中发送

client_secret
,Gitea 支持这一点。除了
OpenID Connect Spec
中定义的 client_secret_post 之外,还有一些其他客户端身份验证方法。

不幸的是,oidcdebugger.com 目前不允许更改客户端身份验证方法。这可能会使您的提供商在测试期间难以识别此问题。

另请注意,Spring Security 5.5 弃用了旧的

post
方法,转而采用更清晰的
client_secret_post
来源

© www.soinside.com 2019 - 2024. All rights reserved.