我一直在尝试让Spring OAuth2使用XML配置。我有一个使用Spring Security和最新版本库的完全(非Spring Boot)工作应用程序。在此之前,我已经配置了Spring Social for Google并可以正常工作。
从应用程序上下文开始(还有很多,但可能不相关)。我已经编写了自己的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
之后,但这对我没有用。
如果用户未通过身份验证,那么我会得到
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和其他示例,但看不到应该发生什么或哪里出错了。