2016-12-15 11 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:

Любая помощь будет оценена.

ответ

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(); 
      } 
     }; 
    } 

Вы можете увидеть весь Социальный Config файл ниже:

@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