2016-12-15 203 views
2

我使用spring-social-facebook有时,认证似乎一段时间后到期,我得到这个异常:如何处理ExpiredAuthorizationException(授权已过期)的春季,社会Facebook的

org.springframework.social.ExpiredAuthorizationException: The authorization has expired. 
    at org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleFacebookError(FacebookErrorHandler.java:83) 
    at org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleError(FacebookErrorHandler.java:59) 
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:667) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:620) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:595) 
    at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:303) 
    at org.springframework.social.facebook.api.impl.SocialContextTemplate.getSocialContext(SocialContextTemplate.java:120) 

我不不知道如何处理这个错误...在身份验证过期后是否可以自动重新连接?使用

版本:

<dependency> 
    <groupId>org.springframework.social</groupId> 
    <artifactId>spring-social-facebook</artifactId> 
    <version>2.0.4.BUILD-SNAPSHOT</version> 
</dependency> 

<dependency> 
    <groupId>org.springframework.social</groupId> 
    <artifactId>spring-social-core</artifactId> 
    <version>1.1.4.RELEASE</version> 
</dependency> 

我发现类似的问题在SO:

任何帮助将是apreciated。

回答

2

要解决这个问题,你必须添加ReconnectFilter到社会形态的Java文件:

@Bean 
    public ReconnectFilter apiExceptionHandler(UsersConnectionRepository usersConnectionRepository, UserIdSource userIdSource) { 
     return new ReconnectFilter(usersConnectionRepository, userIdSource); 
    } 

ReconnectFilter依赖于UserIdSource Bean来获取用户信息,并刷新连接。你必须重写它:

@Override 
    @Bean 
    public UserIdSource getUserIdSource() { 
     return new UserIdSource() { 
      @Override 
      public String getUserId() { 
       User user = getUser(); 
       if (user == null) { 
        throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in"); 
       } 
       return user.getId(); 
      } 
     }; 
    } 

下面你可以看到整个社会的配置文件:

@Configuration 
@PropertySource("classpath:application.properties") 
@EnableSocial 
public class SocialConfig extends SocialConfigurerAdapter { 

    @Override 
    public void addConnectionFactories(ConnectionFactoryConfigurer cfConfig, Environment env) { 
     cfConfig.addConnectionFactory(new FacebookConnectionFactory(env.getProperty("facebook.appKey"), env.getProperty("facebook.appSecret"))); 
    } 


    @Bean 
    public UsersConnectionRepository usersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) { 
     return new UserConnectionRepositoryImpl(connectionFactoryLocator); 
    } 

    @Override 
    @Bean 
    public UserIdSource getUserIdSource() { 
     return new UserIdSource() { 
      @Override 
      public String getUserId() { 
       User user = getUser(); 
       if (user == null) { 
        throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in"); 
       } 
       return user.getId(); 
      } 
     }; 
    } 

    @Bean 
    public ReconnectFilter apiExceptionHandler(UsersConnectionRepository usersConnectionRepository, UserIdSource userIdSource) { 
     return new ReconnectFilter(usersConnectionRepository, userIdSource); 
    } 


    @Bean 
    @Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES) 
    public ConnectionRepository connectionRepository(ConnectionFactoryLocator connectionFactoryLocator) { 

     User user = getUser(); 
     if (user == null) { 
      throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in"); 
     } 
     return usersConnectionRepository(connectionFactoryLocator).createConnectionRepository(user.getId()); 
    } 

    @Bean 
    @Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES) 
    public Facebook facebook(ConnectionRepository repository) { 
     Connection<Facebook> connection = null; 

     if (repository != null) { 
      connection = repository.findPrimaryConnection(Facebook.class); 
     } 

     return connection != null ? connection.getApi() : null; 
    } 


} 
+0

非常感谢@Xavi托伦斯 – troig