2013-07-18 4 views
0

스프링 보안과 스프링 소셜을 사용하여 사용자를 인증하고 웹 앱에 로컬 계정을 자동으로 생성합니다. 인증을 위해 OAuth2 scope을 어떻게 제공합니까? scope 가야 곳 spring-social-samples에서 spring-social-security SocialAuthenticationFilter를 사용하여 OAuth2 범위를 지정하는 방법은 무엇입니까?

, 내가 볼 수 없습니다.

<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에 대한 특정 유스 케이스는 사용자가 페이스 북으로 인증 한 후 로컬 계정을 생성하는 사용자의 페이스 북 이메일 (scope="email")을 얻을 수 있도록하는 것입니다.

답변

8

구성에 따라 FacebookAuthenticationService의 속성으로 scope을 지정해야합니다. 이 대신에, XML 구성에서 auth/facebook

에 전화를 처리하는 서비스입니다 :

<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 :에 의한 콩 클래스의 잘못된 속성 '범위'[org.springframework.social.facebook.security.FacebookAuthenticationService] : 콩 속성 '범위'에 쓰기 권한이 없습니다 또는 잘못된 setter 메소드가 있습니다. setter의 매개 변수 유형이 getter의 반환 유형과 일치합니까? – 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 매개 변수를 전달할 수 있습니다. ,

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

그것은 페이스 북에 대해 동일한 원칙이 너무 그냥 적절한 범위의 값을 사용 : 공식 문서에서 example for twitter를 참조하십시오.

하면이 부분을 놓친하지 않는 것이 확인 :

페이스 북 액세스 토큰은 약 2 시간 후에 만료됩니다. 따라서 사용자가 2 시간 동안 다시 인증하도록 요청하지 않으려면 수명이 긴 액세스 토큰을 유지하는 가장 좋은 방법은 "offline_access"를 요청하는 것입니다.

+2

와 함께 작동 위의 예제는 URL'/ connect/{provider} '를 사용하는'ProviderSignInController'에 대한 것입니다. 나는 url'/ auth/{provider}'를 사용하는'SocialAuthenticationFilter' 또는 사용자 관점에서 한 번의 마우스 클릭으로 둘을 결합하는 방법을 찾아내는 것과 같은 일을하고 싶습니다. –

+0

안녕하세요 @ VictorLyuboslavsky, 아직 해결책을 찾을 수 있습니까? 또한 SocialAuthenticationFilter를 사용하고 놀랍게도 숨겨진 양식 필드를 내 localhost에서 작동하지만 생산 현장에서는 그렇지 않습니다. – shailesh

+0

@VictorLyuboslavsky @shailesh 당신이 해결책을 찾았는지 모르겠지만 매우 간단합니다. GET 매개 변수 범위를 사용하고'/ auth/facebook' 대신'auth/facebook? scope = email'을 사용하십시오. – Jagger

관련 문제