Я пытаюсь понять, почему анонимные пользователи в клиенте не могут получить токен доступа.Spring Security Oauth2 - InsufficientAuthenticationException: для получения токена доступа требуется анонимность (анонимно не разрешено)
Я нашел post on the Spring Blog по этой теме, где Дэйв Syer отвечает так:
Помните, что это проблема связана с клиентским приложением, а не сервер аутентификации , поэтому постарайтесь увидеть его с точки представления о клиенте. На шаге 1 пользователь пытается получить доступ к защищенному ресурсу. Если вы не можете идентифицировать этого пользователя, то все ваши пользователи получат тот же токен доступа (тот, который первый пользователь получает с помощью своих учетных данных на сервере auth). Это определенно плохая идея.
Однако я не понимаю, почему анонимные пользователи будут один и той же фишка:
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth instanceof AnonymousAuthenticationToken) {
if (!resource.isClientOnly()) {
throw new InsufficientAuthenticationException(
"Authentication is required to obtain an access token (anonymous not allowed)");
}
}
Хотя они не полностью идентифицированы, они имеют JSESSIONID связаны с каждым отдельным анонимным пользователем.
OAuth2ClientContext
, который будет содержать accessToken, представляет собой сессионный компонент Spring bean. Поскольку у анонимных пользователей есть HttpSession, у них есть независимые OAuth2ClientContext
, так что они могут хранить отдельные accessTokens.
Может ли кто-нибудь объяснить, если это имеет смысл или что я не понимаю?
Благодарим вас за то, что нашли время, чтобы прояснить это. Вы абсолютно правы, с того момента, как мы настраиваем 'JdbcClientTokenServices' для сохранения токенов, поскольку запрос' selectAccessTokenSql' использует 'Authentication.getName()' (который был бы анонимнымUser), все пользователи будут делиться токеном. Однако, пока мы не сохраняем токены, проблем не будет, я дважды проверил, что «OAuth2ClientContext» является областью сеанса, и каждый клиент сохраняет свой собственный доступ к Token в HttpSession.Запрос мог быть реализован для использования session.id вместо 'Authorization.getName()' ... – codependent
, может быть, это к раннему. Я не помню, что серверы oauth2 auth без слоя сохранения сохраняются. Без сохранения токена, как бы вы проверили, что токен, отправленный с клиента, действителен? Как бы вы сравнили это с чем-нибудь? Как бы вы отменили его/обновили? Может быть, вам нужен токен JWT, а не oauth2 bearer :) – freakman
Возможно, я не объяснил это хорошо ... конечно, нам нужен сервер для хранения токенов, я имел в виду постоянство токена клиента, которое выполняется через 'JdbcClientTokenServices', и это необязательно. – codependent