我已经配置了我的 spring 身份验证服务器,但 openid 的同意屏幕未显示,但对于其他范围(例如 read),它显示同意屏幕,这是什么原因?
我在互联网上搜索过,但没有找到任何解决方案,有人可以帮助我吗?如果我们想仅显示特定范围而不是其他范围的同意屏幕,有没有办法做到这一点?
我已经配置了我的 spring 身份验证服务器,但 openid 的同意屏幕未显示,但对于其他范围(例如 read),它显示同意屏幕,这是什么原因?
在我的一个项目中遇到了类似的问题,即使请求的范围只是 openid,我也想显示同意屏幕。 出现此行为的原因是,当唯一请求的范围是 openid 时,身份验证提供程序会对请求进行身份验证并返回 OAuth2AuthorizationCodeRequestAuthenticationToken,而不检查系统中是否存在同意。
您可以在
requireAuthorizationConsent
类中的 OAuth2AuthorizationCodeRequestAuthenticationProvider
方法中找到此逻辑。
重写此行为的一种方法是实现 AuthenticationProvider 并创建自定义类。
还重写支持方法,如下所示:
public boolean supports(Class<?> authentication) {
return OAuth2AuthorizationCodeRequestAuthenticationToken.class.isAssignableFrom(authentication);
}
您可以在身份验证方法中实现自定义逻辑,并确保在身份验证方法中返回
OAuth2AuthorizationConsentAuthenticationToken
,以便它重定向到同意屏幕。
您创建的 CustomAuthenticationProvider 应添加到您的配置类中 OAuth2AuthorizationConfugurer 的认证提供程序中,如下所示。
http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
.authorizationEndpoint(authorizationEndpoint ->
authorizationEndpoint
.authenticationProvider(customOauth2AuthorizationCodeRequestAuthenticationProvider())