RequestEnhancer не используется для AuthorizationCodeAccessTokenProvider во время getRedirectForAuthorization

Что я пытаюсь сделать, так это добавить дополнительный параметр 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;
        }
    }
}

person eolsson    schedule 26.06.2014    source источник
comment
Это может зависеть от того, как вы создали OAuth2ClientContext (но если вы видите исходный client_id и т. д., я удивлюсь, если это проблема). Если вы поделитесь минимальным проектом с этим кодом шаблона, я могу посмотреть и попытаться понять, что происходит.   -  person Dave Syer    schedule 26.06.2014
comment
Теперь обновлен тестовым набором   -  person eolsson    schedule 26.06.2014
comment
В какой момент вы вводите своего настроенного поставщика токенов? UserInfoRestTemplateCustomizer предоставляет setAccessTokenProvider(), но мой клиентский провайдер никогда не вызывается.   -  person Brett    schedule 22.03.2016