【问题标题】:How to handle ExpiredAuthorizationException (The authorization has expired) in spring-social-facebookspring-social-facebook如何处理ExpiredAuthorizationException(授权已过期)
【发布时间】:2016-12-15 17:32:42
【问题描述】:

我正在使用spring-social-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: 中发现了类似的问题:

我们将不胜感激。

【问题讨论】:

    标签: java facebook spring-social spring-social-facebook


    【解决方案1】:

    要解决此问题,您必须在社交配置 Java 文件中添加 ReconnectFilter:

        @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;
        }
    
    
    }
    

    【讨论】:

    • 非常感谢@Xavi Torrens
    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多