2013-07-18 72 views
0

我使用Spring Social與Spring Security進行身份驗證,並在我的網絡應用程序中自動創建本地帳戶。如何提供OAuth2 scope進行身份驗證?如何使用spring-social-security SocialAuthenticationFilter指定OAuth2範圍?

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")創建一個本地帳戶。

回答

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> 

這適用於春季社會1.1.0.M3

+0

恐怕這是1.1.0.M4上的失敗。由於:org.springframework.beans.NotWritablePropertyException:bean類的屬性'scope'無效[org.springframework.social.facebook.security.FacebookAuthenticationService]:Bean屬性'scope'不可寫,或者具有無效的setter方法。設置器的參數類型是否與獲取器的返回類型匹配 – Christoph

+3

1.1.0.M4中的屬性名稱已從範圍更改爲defaultScope。請參閱https://github.com/spring-projects/spring-social/blob/1.1.0.M4/spring-social-security/src/main/java/org/springframework/social/security/provider/OAuth2AuthenticationService.java – Christoph

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」。

+2

的上面的例子用於'ProviderSignInController',它使用url'/ connect/{provider}'。我想用'SocialAuthenticationFilter'做同樣的事情,它使用url'/ auth/{provider}'或者想出如何從用戶的角度單擊鼠標來組合這兩者。 –

+0

Hi @VictorLyuboslavsky,你能找到解決方案嗎?我也使用SocialAuthenticationFilter,令人驚訝的是,將範圍作爲隱藏的表單字段傳遞給我的本地主機,但不在生產中! – shailesh

+0

@VictorLyuboslavsky @shailesh我不知道你是否找到了解決方案,但它非常簡單。使用GET參數範圍而不是'/ auth/facebook'使用'auth/facebook?scope = email'。 – Jagger