弹出与Facebook的社交连接并访问用户数据

时间:2014-06-20 11:34:32

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

我已经开始使用spring social并遵循here的教程。和随后的页面。 我的java文件看起来像这样。

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

//import org.springframework.boot.SpringApplication;
//import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.social.connect.Connection;
import org.springframework.social.connect.ConnectionFactory;
import org.springframework.social.connect.ConnectionFactoryLocator;
import org.springframework.social.connect.support.ConnectionFactoryRegistry;
import org.springframework.social.facebook.api.Comment;
import org.springframework.social.facebook.api.CommentOperations;
import org.springframework.social.facebook.connect.FacebookConnectionFactory;
import org.springframework.social.facebook.api.Facebook;
import org.springframework.social.facebook.api.impl.FacebookTemplate;
import org.springframework.social.oauth2.AccessGrant;
import org.springframework.social.oauth2.GrantType;
import org.springframework.social.oauth2.OAuth2Operations;
import org.springframework.social.oauth2.OAuth2Parameters;
//import org.springframework.social.UserIdSource;
//import org.springframework.social.connect.ConnectionFactoryLocator;
//import org.springframework.social.connect.ConnectionRepository;
//import org.springframework.social.connect.web.ConnectController;

@Configuration
@EnableAutoConfiguration
@Import(FacebookConfig.class)
@ComponentScan
public class App {

   static private String accessToken = "accesstoken";
   static private String secretKey = "secretkey"; 
   static private String clientId = "clientid";
   public static void main(String[] args) {
        FacebookConnectionFactory connectionFactory = new FacebookConnectionFactory(clientId, secretKey);
        OAuth2Operations oauthOperations = connectionFactory.getOAuthOperations();
        OAuth2Parameters params = new OAuth2Parameters();
        params.setRedirectUri("http://facebook.com");
        String authorizeUrl = oauthOperations.buildAuthorizeUrl(GrantType.IMPLICIT_GRANT, params);
        AccessGrant accessGrant = new AccessGrant(accessToken);
        System.out.println(accessGrant.getAccessToken());
        System.out.println(accessGrant.getExpireTime());
        System.out.println(accessGrant.getScope());
        ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
        registry.addConnectionFactory(connectionFactory);
        Facebook facebook = new FacebookTemplate(accessToken);
}

}

当我运行此代码时,我得到了所述的错误。 无法在项目mavenproject3上执行目标org.codehaus.mojo:exec-maven-plugin:1.2:exec(default-cli):命令执行失败。退出并出现错误:1(退出值:1) - > [帮助1]

要查看错误的完整堆栈跟踪,请使用-e开关重新运行Maven。 使用-X开关重新运行Maven以启用完整的调试日志记录。

有关错误和可能的解决方案的更多信息,请阅读以下文章: [帮助1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

当我注释掉这一行时:

Facebook facebook = new FacebookTemplate(accessToken);

工作正常。 有人可以建议我必要的。我是新手,请耐心等待。

1 个答案:

答案 0 :(得分:1)

您提到的URL实际上并不是一个教程,因为它是一个参考。不可否认,它有点详细,对新用户不是很有帮助。正好注意到......我希望在我有时间的时候写一个新的教程

你在哪里获得了accessToken的价值?如果你没有通过Facebook的OAuth2“舞蹈”获得它,那么它就无法运作。

首先,我看到你创建了一个FacebookConnectionFactory来获取OAuth20perations,你可以通过它设置重定向URI等等,然后为IMPLICIT grant建立一个授权URL。有几种不合适的东西:

  • Facebook不支持IMPLICIT拨款。它仅支持授权代码授予和客户端令牌授权。即便如此,使用隐式授权和授权代码授予您的应用必须重定向到Facebook(在Web浏览器中)才能获得用户的许可。一旦授予,它将重定向回您的应用程序...说到哪...
  • 您设置的重定向URI为http://facebook.com。那个 应该是你的应用程序的URL,Facebook将在授权后重定向回来。
  • 在完成所有这些之后,你甚至都不会使用authorizeUrl ...它只是在一个字符串中。由于上面提到的原因,即使您使用它也不会起作用,但前5行左右都是无用的。
  • 您创建了一个ConnectionFactoryRegistry并向其注册了FacebookConnectionFactory ......但是您对ConnectionFactoryRegistry一无所知。没关系......你几乎从不需要对它做任何事情,因为它主要作为ConnectController的助手存在。

在没有重定向“舞蹈”的情况下,根本没有获得面向用户的访问令牌的好方法。获得用户的许可非常重要,您将代表他们访问Facebook。如果它比这更容易,那么方式太容易创建一个漫游Facebook的应用程序,并且基本上破坏了每个人的体验。

通过重定向“舞蹈”获取访问令牌的工作由框架使用ConnectController自动处理。当然,如果您愿意,可以自己动手,但ConnectController将为您处理所有这些。

由于目前缺乏适当的教程,我建议您查看https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-showcase。此外,它在https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-showcase-boot有一个面向Spring Boot的版本,它可以更简化配置(尽管它依赖于尚未在官方Spring Boot版本中发生的更改)。