У нас есть приложение, которое использует spring-security-oauth2:1.0
. Я пытался изменить его на более новую версию, spring-security-oauth2:2.0.7.RELEASE
. Некоторые классы были удалены, некоторая структура пакета изменилась, мне удалось разобраться во всех этих вещах, и я смог запустить сервер без каких-либо проблем. Но здесь я сталкиваюсь со странной проблемой.
В OAuth2 - 1.0 version
, когда пользователь входит в систему, мы использовали GET
запрос к /oauth/token
, например:
И раньше он работал просто отлично.
Когда я пытаюсь сделать то же самое, во-первых, я не могу сделать запрос GET
из-за логики в TokenEndPoint.java
private Set<HttpMethod> allowedRequestMethods = new HashSet<HttpMethod>(Arrays.asList(HttpMethod.POST));
@RequestMapping(value = "/oauth/token", method=RequestMethod.GET)
public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, @RequestParam
Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
if (!allowedRequestMethods.contains(HttpMethod.GET)) {
throw new HttpRequestMethodNotSupportedException("GET");
}
return postAccessToken(principal, parameters);
}
Я попытался сделать POST
запрос, такой же, как приведенный выше URL-адрес, но я получаю InsufficientAuthenticationException
с сообщением об ошибке
Нет аутентификации клиента. Попробуйте добавить соответствующий фильтр аутентификации
Это из-за следующего контроллера запросов POST
в TokenEndpoint.java
. Когда я отлаживаю, я вижу, что principal
является нулевым.
@RequestMapping(value = "/oauth/token", method=RequestMethod.POST)
public ResponseEntity<OAuth2AccessToken> postAccessToken(Principal principal, @RequestParam
Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
//principal is null here
if (!(principal instanceof Authentication)) {
throw new InsufficientAuthenticationException(
"There is no client authentication. Try adding an appropriate authentication filter.");
}
.............
}
У меня есть фильтр аутентификации, и он работал хорошо, когда я использовал version 1.0
. Это соответствующие прароды моего конфига:
<authentication-manager xmlns="http://www.springframework.org/schema/security">
<authentication-provider user-service-ref="userDetailsService"/>
</authentication-manager>
<bean id="userDetailsService" class="com.hcl.nc.service.UserDetailsService">
<constructor-arg><ref bean="sessionFactory" /></constructor-arg>
</bean>
Я всегда думал, что запрос будет аутентифицирован authentication-provider
и отправляется в token-endpoint
но это не похоже на правильный поток. После отладки приложения с version 2.0.7
теперь я действительно сомневаюсь в своем понимании потока.
Может кто-нибудь объяснить, почему он работал в предыдущей версии и почему он не работает сейчас?
Должен ли я сделать что-то другое, чтобы получить токен OAuth?
ПРИМЕЧАНИЕ: я уже проверил эти вопросы: здесь, здесь, здесь. Но я не смог найти правильного решения.