0

我正在使用 Spring Social 和 Spring Security 来验证用户身份并在我的 Web 应用程序上自动创建本地帐户。如何提供 OAuth2scope进行身份验证?

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") 以创建本地帐户。

4

2 回答 2

8

在您的配置中,您需要指定scopeFacebookAuthenticationService. 这是处理调用的服务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

于 2013-07-20T14:28:29.527 回答
3

scope您可以在连接/注册表单中传递附加参数。请参阅官方文档中的 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”。

于 2013-07-19T08:41:52.247 回答