Я пытаюсь реализовать клиент OAuth2 с SpringBoot 1.5.13 и spring-security-oauth2 2.0.15.RELEASE.
Я хочу иметь возможность авторизовать анонимных пользователей с предоставлением auth_code. Однако я сталкиваюсь с проблемами при попытке завершить sh поток аутентификации. Поскольку я не хочу вызывать какие-либо внешние службы для получения информации о личности пользователя, я использую DefaultTokenServices
. Для DefaultTokenServices
требуется TokenStore для его работы, поэтому я предоставляю самый простой - InMemoryTokenStore
.
Я испробовал два подхода, которые оба потерпели неудачу:
1. Redirect to OAuth2ClientAuthenticationProcessingFilter
Если я перенаправлю пользователя после предоставления авторизации на URL-адрес, на который фильтруется OAuth2ClientAuthenticationProcessingFilter
, фильтр правильно запрашивает и получает токен доступа. Однако, следующее, что он пытается сделать, это:
OAuth2Authentication result = tokenServices.loadAuthentication(accessToken.getValue());
И этот вызов не удается на BadCredentialsException("Could not obtain user details from token")
, потому что DefaultTokenService
пытается вызвать tokenStore#readAccessToken
, но InMemoryTokenStore
совершенно пуст этот пункт.
2. Перенаправление на другой URL (простой RestController)
Если я перенаправлю пользователя после предоставления авторизации на другой URL, который не соответствует OAuth2ClientAuthenticationProcessingFilter
, я даже не смогу получить токен доступа. При попытке вызвать restTemplate.getAccessToken()
в RestController, сбой вызова в AccessTokenProviderChain
из-за этого исключения:
if (auth instanceof AnonymousAuthenticationToken) {
if (!resource.isClientOnly()) {
throw new InsufficientAuthenticationException(
"Authentication is required to obtain an access token (anonymous not allowed)");
}
}
РЕДАКТИРОВАТЬ: Я пытался использовать мою собственную реализацию AccessTokenProviderChain
, которая просто пропускает эту проверку, и части, связанные с clientTokenServices
, и на первый взгляд кажется, что это работает. Но я не уверен, что это правильный подход, достаточный для многопользовательской работы (несколько анонимных одновременных пользователей, авторизующихся через нескольких поставщиков OAuth2).
Очевидно, что моя авторизация - анонимная авторизация, мне нужно ан аноним поток авторизации! Я знаю, что это вполне возможно в Spring Security 5.2.x, но я не понимаю, как это сделать в spring-security-oauth2?
Разве невозможно выполнить анонимную авторизацию с помощью auth_code grant?