Spring security getRedirectForAuthorization期间,RequestEnhancer未用于AuthorizationCodeAccessTokenProvider

Spring security getRedirectForAuthorization期间,RequestEnhancer未用于AuthorizationCodeAccessTokenProvider,spring-security,spring-security-oauth2,Spring Security,Spring Security Oauth2,我试图做的是在我的授权请求中添加一个额外的参数openid.realm 我的问题非常类似于,我尝试按照概述的方法解决它: //创建添加openid.realm的增强器 DefaultRequestEnhancer enhancer=新的DefaultRequestEnhancer(); setParameterIncludes(Arrays.asList(“openid.realm”); //创建使用增强器的令牌提供程序 授权代码访问令牌提供程序令牌提供程序= 新的AuthorizationCo

我试图做的是在我的授权请求中添加一个额外的参数
openid.realm

我的问题非常类似于,我尝试按照概述的方法解决它:

//创建添加openid.realm的增强器
DefaultRequestEnhancer enhancer=新的DefaultRequestEnhancer();
setParameterIncludes(Arrays.asList(“openid.realm”);
//创建使用增强器的令牌提供程序
授权代码访问令牌提供程序令牌提供程序=
新的AuthorizationCodeAccessTokenProvider();
setAuthorizationRequestEnhancer(增强器);
//将令牌提供者提供给rest模板
googleOauthRestTemplate.setAccessTokenProvider(tokenProvider);
googleOauthRestTemplate。
getOAuth2ClientContext()。
getAccessTokenRequest().set(“openid.realm”http://localhost:8080/");
//尝试获取受保护的资源
googleOauthRestTemplate。
getForObject(“https://www.googleapis.com/...“,String.class);
现在,当用户第一次点击此代码时,他会被抛出一个
UserRedirectRequiredException
(源自getRedirectForAuthorization),其中的参数有
client\u id
redirect\u uri
response\u type
scope
,它们看起来都不错,但我缺少了我认为刚刚设置的
openid.realm
参数

它不应该在重定向期间也在那里吗

更新:

下面是一个新的测试用例,在最后一次断言中失败。(放入文件:
AuthorizationCodeAccessTokenProviderTests.java

@测试
public void testenhancedDirectToAuthorizationEndpoint()引发异常{
DefaultRequestEnhancer enhancer=新的DefaultRequestEnhancer();
setParameterIncludes(Arrays.asList(“openid.realm”);
setAuthorizationRequestEnhancer(增强器);
AccessTokenRequest=新的DefaultAccessTokenRequest();
request.set(“openid.realm”http://localhost:8080");
request.setCurrentUri(“/come/back/soon”);
resource.setUserAuthorizationUri(“http://localhost/oauth/authorize");
试一试{
accesstoken(资源、请求);
失败(“预期的UserRedirectRequiredException”);
}
捕获(UserRedirectRequiredException e){
资产质量(”http://localhost/oauth/authorize“,e.getRedirectUri());
assertEquals(“/come/back/soon”,e.getStateToPreserve());
assertEquals(“代码”,例如getRequestParams().get(“响应类型”);
资产质量(”http://localhost:8080,e.getRequestParams().get(“openid.realm”);
}
}
更新2: 我已经通过扩展令牌提供程序和手动添加参数解决了这个问题。也许这不是正确的方法,但至少在我的具体案例中是有效的:

类增强授权CodeAccessTokenProvider扩展授权CodeAccessTokenProvider{
静态字符串请求\u参数\u OPENID\u REALM=“OPENID.REALM”;
@凌驾
公共OAuth2AccessToken获得AccessToken(OAuth2ProtectedResourceDetails,AccessTokenRequest请求)引发UserRedirectRequiredException、UserApprovalRequiredException、AccessDeniedException、OAuth2AccessDeniedException{
试一试{
返回super.obtainAccessToken(详细信息,请求);
}捕获(UserRedirectRequiredException e){
Map requestParams=e.getRequestParams();
if(!requestParams.containsKey(REQUEST_PARAM_OPENID_REALM)和&REQUEST.containsKey(REQUEST_PARAM_OPENID_REALM)){
requestParams.put(REQUEST_PARAM_OPENID_REALM,REQUEST.getFirst(REQUEST_PARAM_OPENID_REALM));
}
投掷e;
}
}
}

这可能取决于您是如何创建
OAuth2ClientContext
(但是如果您看到原始的客户端id等,我很惊讶这是否是一个问题)。如果您共享一个包含此模板代码的最小项目,我可以看一看并尝试了解发生了什么。现在使用TestCase更新您在什么时候注入自定义令牌提供程序?userInfoRestTemplateCustomizer提供了一个setAccessTokenProvider(),但从未调用我的客户提供程序。