私がやろうとしているのはopenid.realm
、承認リクエストに追加のパラメーターを追加することです。
私の問題はhttps://github.com/spring-projects/spring-security-oauth/issues/123と非常によく似ており、概説に従って解決しようとしました:
// Create an enhancer that adds openid.realm
DefaultRequestEnhancer enhancer = new DefaultRequestEnhancer();
enhancer.setParameterIncludes(Arrays.asList("openid.realm"));
// Create tokenprovider that use the enhancer
AuthorizationCodeAccessTokenProvider tokenProvider =
new AuthorizationCodeAccessTokenProvider();
tokenProvider.setAuthorizationRequestEnhancer(enhancer);
// Give the tokenProvider to the rest template
googleOauthRestTemplate.setAccessTokenProvider(tokenProvider);
googleOauthRestTemplate.
getOAuth2ClientContext().
getAccessTokenRequest().set("openid.realm", "http://localhost:8080/");
// Try to get the protected resource
googleOauthRestTemplate.
getForObject("https://www.googleapis.com/...", String.class);
ユーザーが最初にこのコードをヒットすると、UserRedirectRequiredException
(getRedirectForAuthorization で発生した) がスローされ、そこにあるパラメーターはclient_id
、redirect_uri
、response_type
およびscope
です。それらはすべて問題ないように見えますが、openid.realm
設定したばかりのパラメーターがありません。
リダイレクト中にも存在するべきではありませんか?
アップデート:
最後のアサートで失敗する新しいテストケースを次に示します。(ファイルに入れる: AuthorizationCodeAccessTokenProviderTests.java
)
@Test
public void testEnhancedRedirectToAuthorizationEndpoint() throws Exception {
DefaultRequestEnhancer enhancer = new DefaultRequestEnhancer();
enhancer.setParameterIncludes(Arrays.asList("openid.realm"));
provider.setAuthorizationRequestEnhancer(enhancer);
AccessTokenRequest request = new DefaultAccessTokenRequest();
request.set("openid.realm", "http://localhost:8080");
request.setCurrentUri("/come/back/soon");
resource.setUserAuthorizationUri("http://localhost/oauth/authorize");
try {
provider.obtainAccessToken(resource, request);
fail("Expected UserRedirectRequiredException");
}
catch (UserRedirectRequiredException e) {
assertEquals("http://localhost/oauth/authorize", e.getRedirectUri());
assertEquals("/come/back/soon", e.getStateToPreserve());
assertEquals("code", e.getRequestParams().get("response_type"));
assertEquals("http://localhost:8080", e.getRequestParams().get("openid.realm"));
}
}
更新 2: トークン プロバイダーを拡張し、パラメーターを手動で追加することで、この問題を回避しました。たぶんそれは正しい方法ではありませんが、少なくとも私の特定のケースではうまくいくようです:
class EnhancedAuthorizationCodeAccessTokenProvider extends AuthorizationCodeAccessTokenProvider {
static String REQUEST_PARAM_OPENID_REALM = "openid.realm";
@Override
public OAuth2AccessToken obtainAccessToken(OAuth2ProtectedResourceDetails details, AccessTokenRequest request) throws UserRedirectRequiredException, UserApprovalRequiredException, AccessDeniedException, OAuth2AccessDeniedException {
try {
return super.obtainAccessToken(details, request);
} catch (UserRedirectRequiredException e) {
Map<String, String> 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));
}
throw e;
}
}
}