InsufficientAuthenticationException: Аутентификация необходима для получения токена доступа (анонимный доступ запрещен) - при выполнении запроса токена ROPC - PullRequest
0 голосов
/ 01 апреля 2019

Это может звучать немного странно.Но у меня есть ситуация, когда моему приложению нужно сделать запрос токена ROPC с userdetails, который нужно взять из свойств.

Вызов инициируется, когда есть случайный входящий запрос, который является анонимным.Но в запросе токена при достижении AccessTokenProviderChain.class запрос токена завершается неудачно.

org.springframework.security.authentication.InsufficientAuthenticationException: требуется аутентификация для получения токена доступа (анонимный доступ запрещен)

При отладке я обнаружил, что это происходит вниже линии.

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth instanceof AnonymousAuthenticationToken && !resource.isClientOnly()) {
    throw new InsufficientAuthenticationException("Authentication is required to obtain an access token (anonymous not allowed)");
}

Я вижу, что AnonymousAuthenticationFilter устанавливает принципал как anonymousUser

  • Это потому, что входящий запрос является анонимным, и я пытаюсь сделать запрос токена ROPC?
  • Это потому, что я включил @EnableMongoAuditing.

Есть ли способ исправить эту проблему, кроме создания пользовательского запроса токена.

Код:

public OAuth2RestTemplate myappROPCRestTemplate() {
    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(myappPasswordResourceDetails());
    restTemplate.setAccessTokenProvider(getAccessTokenProvider());

    if (proxyEnabled) {
        restTemplate.setRequestFactory(getRequestFactoryWithProxy());
    }

    return restTemplate;
}



private AccessTokenProvider getAccessTokenProvider() {
    ResourceOwnerPasswordAccessTokenProvider resourceOwnerPasswordAccessTokenProvider = new ResourceOwnerPasswordAccessTokenProvider();
    if (proxyEnabled) {
        resourceOwnerPasswordAccessTokenProvider.setRequestFactory(getRequestFactoryWithProxy());
    }
    return new AccessTokenProviderChain(Collections.singletonList(resourceOwnerPasswordAccessTokenProvider));
}

private SimpleClientHttpRequestFactory getRequestFactoryWithProxy() {
    SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
    requestFactory.setOutputStreaming(false);
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, Integer.parseInt(proxyPort)));
    requestFactory.setProxy(proxy);
    return requestFactory;
}

private OAuth2ProtectedResourceDetails myappPasswordResourceDetails() {
    ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails();
    resource.setAccessTokenUri(tokenUrl);
    resource.setClientId(clientId);
    resource.setClientSecret(clientSecret);
    resource.setUsername(username);
    resource.setPassword(password);
    resource.setClientAuthenticationScheme(AuthenticationScheme.form);
    resource.setGrantType("password");
    return resource;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...