Я пытался заставить Spring OAuth2 работать с конфигурацией XML. У меня есть полностью (не Spring Boot) работающее приложение, использующее Spring Security с последними версиями библиотек. До этого я настроил и работал Spring Social для Google.
Конфигурация XML.
Начиная с контекста приложения (есть намного больше, но, вероятно, не имеет значения). Я написал свой ClientTokenServicesImpl
, но он работает так же.
<oauth:client id="oAuth2ClientFilter" />
<oauth:resource id="google" type="authorization_code" client-id="${google.clientId}" client-secret="${google.clientSecret}" access-token-uri="${google.accessTokenUri}"
user-authorization-uri="${google.authorisationUri}" scope="email,profile,openid" />
<oauth:rest-template id="oAuthRestTemplate" resource="google" access-token-provider="accessTokenProvider" />
<bean id="accessTokenProvider" class="org.springframework.security.oauth2.client.token.AccessTokenProviderChain">
<property name="clientTokenServices">
<bean class="com.tetsuwantech.atom.manager.authentication.oauth2.ClientTokenServicesImpl" />
</property>
<constructor-arg>
<list>
<bean class="org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider" />
<bean class="org.springframework.security.oauth2.client.token.grant.implicit.ImplicitAccessTokenProvider" />
<bean class="org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider" />
<bean class="org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsAccessTokenProvider" />
</list>
</constructor-arg>
</bean>
<security:http entry-point-ref="authenticationEntryPoint" access-decision-manager-ref="accessDecisionManager">
...
<security:intercept-url pattern="/oauth2/**" access="permitAll" />
...
<security:custom-filter after="EXCEPTION_TRANSLATION_FILTER" ref="oAuth2ClientFilter" />
</security:http>
Контроллер
У меня есть простой Controller
, который просто звонит в Google, чтобы получить профиль пользователя. Как только я получу данные правильно, я смогу использовать их для создания новой учетной записи пользователя или для аутентификации пользователя. (Я думал, что Spring сделает аутентификацию для меня.)
@Inject
private RestOperations restTemplate;
@RequestMapping(value = "/oauth2/google")
public String google() {
ObjectNode objectNode = restTemplate.getForObject("https://people.googleapis.com/v1/people/me", ObjectNode.class);
return "redirect:/";
}
UserRedirectRequiredException
Если пользователь вошел в систему, а затем нажал на URL, который я получил
org.springframework.security.oauth2.client.resource.UserRedirectRequiredException: A redirect is required to get the users approval
В большинстве примеров говорится о повышении на oAuth2ClientFilter
выше сразу после SECURITY_CONTEXT_FILTER
, но у меня это не сработало.
InsufficientAuthenticationException
Если пользователь не аутентифицирован, тогда я получаю
org.springframework.security.authentication.InsufficientAuthenticationException: Authentication is required to obtain an access token (anonymous not allowed)
Учитывая, что я хочу пройти аутентификацию пользователя через Google, это кажется ироничным.
Я посмотрел примеры в https://projects.spring.io/spring-security-oauth/docs/oauth2.html и много-много Stackoverflow и других примеров, и я не вижу, что должно произойти или где я ошибся.