我正在使用Spring Social和Spring Security对用户进行身份验证,并在我的网络应用上自动创建本地帐户。如何为身份验证提供OAuth2 scope
?
在spring-social-samples中,我看不到scope
应该去哪里。
<bean id="socialAuthenticationFilter" class="org.springframework.social.security.SocialAuthenticationFilter"
c:_0-ref="authenticationManager"
c:_1-ref="userIdSource"
c:_2-ref="usersConnectionRepository"
c:_3-ref="connectionFactoryLocator"
p:signupUrl="/spring-social-showcase/signup"
p:rememberMeServices-ref="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices#0" />
<bean id="socialAuthenticationProvider" class="org.springframework.social.security.SocialAuthenticationProvider"
c:_0-ref="usersConnectionRepository"
c:_1-ref="socialUsersDetailService" />
scope
的特定用例是让用户通过Facebook进行身份验证,然后获取用户的Facebook电子邮件(scope="email"
)以创建本地帐户。
答案 0 :(得分:8)
在您的配置中,您需要将scope
指定为FacebookAuthenticationService
的属性。这是处理对auth/facebook
在XML配置中,而不是:
<facebook:config app-id="${facebook.clientId}" app-secret="${facebook.clientSecret}"/>
使用:
<bean id="connectionFactoryLocator" class="org.springframework.social.security.SocialAuthenticationServiceRegistry">
<property name="authenticationServices">
<list>
<bean class="org.springframework.social.facebook.security.FacebookAuthenticationService">
<constructor-arg value="${facebook.clientId}" />
<constructor-arg value="${facebook.clientSecret}" />
<!-- Important: The next property name changed from "scope" to "defaultScope" in 1.1.0.M4 -->
<property name="scope" value="email" />
</bean>
</list>
</property>
</bean>
这适用于Spring Social 1.1.0.M3
答案 1 :(得分:3)
您可以在连接/注册表单中传递其他scope
参数。请参阅官方文档中的example for twitter:
<form action="<c:url value="/connect/twitter" />" method="POST">
<input type="hidden" name="scope" value="publish_stream,offline_access" />
...
<button type="submit"><img src="<c:url value="/resources/social/twitter/signin.png" />"/></button>
</form>
这也是facebook的原理,只需使用适当的范围值。
请确保您没有错过这部分:
Facebook访问令牌在约2小时后过期。所以,要避免拥有 要求您的用户重新授权2小时,保持最佳方式 长期访问令牌是请求“offline_access”。