如何使用spring-social-security SocialAuthenticationFilter指定OAuth2范围?

时间:2013-07-18 20:01:54

标签: java spring-security oauth-2.0 spring-social

我正在使用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")以创建本地帐户。

2 个答案:

答案 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”。