我正在使用 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.security.oauth2.client.registration.github.scope=openid
激活基于 Oauth2 构建的 OpenID Connect 身份验证。 但这不再只是 Oauth2,因为它需要该令牌。 如果 Oauth2 是您想要的,只需删除上面的行即可。
是的,这只是令人困惑,这可能就是人们避免使用 OIDC 的原因。
我成功了!
事实证明问题不在代码上。问题出在 github oauth2 凭证上。当我使用由 Google Credentials 生成的令牌/秘密时,除了 application.properties 之外,我不需要更改任何其他内容。
关于 github 登录的谜团仍然存在,因为令牌寄存器上没有太多数据需要更改。
我在使用自托管 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
。 来源