5

私がやろうとしているのは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_idredirect_uriresponse_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;
        }
    }
}
4

0 に答える 0