2

我开发了一个简单的 Web 应用程序,它通过 Spring Boot (v1.2.6.RELEASE) 和 Spring Social Facebook (v2.0.2.RELEASE) 访问 Facebook 数据,类似于此处给出的示例

我在 Facebook 中创建了一个使用 Graph API 2.5 版的新应用程序。

根据这个例子,我修改了 facebookConnect.html 将这个不同的范围放到方法 POST 请求中:

<html>
<head>
    <title>Facebook Extractor</title>
</head>
<body>
    <h3>Connect to Facebook</h3>

    <form action="/recommender/connect/facebook" method="POST">
        <input type="hidden" name="scope" value="public_profile, user_friends, email, user_likes" />
        <div class="formInfo">
            <p>You aren't connected to Facebook yet. Click the button to connect this application with your Facebook account.</p>
        </div>
        <p><button type="submit">Connect to Facebook</button></p>
    </form>
</body>

由 ConnectController 处理,它启动 OAuth 授权代码流......

在 OAuth 成功(授予权限)并完成连接后,我收到以下错误:

(#3) 应用程序没有能力进行这个 api 调用。

这里是处理来自 Facebook 应用程序重定向的控制器的主要部分:

@Controller

@Scope(value="session") 公共类 FacebookExtractor {

private Logger logger = Logger.getLogger(FacebookExtractor.class);

private Facebook facebook;
@Autowired
GraphDatabase graphDatabase;
@Autowired
PersonRepository personRepository;
@Autowired
UserProfileRepository userProfileRepository;
@Autowired
AttributeDefinitionRepository attributeDefinitionRepository;
@Autowired
AttributeRepository attributeRepository;
@Autowired
ConceptRepository conceptRepository;
@Autowired
RecommenderGovConsumerRepository recGovRepository;
@Autowired
GovConsumerInfluencedByGovConsumerRelationshipRepository influenceRepository;
@Autowired
ExtractorListener listener;

private String userBind;

@Inject
public FacebookExtractor(Facebook facebook) {
    this.facebook = facebook;
}

@RequestMapping(method = RequestMethod.GET, value = "/facebookExtractor")
public ModelAndView FacebookDataUserExtraction() {
    if (!facebook.isAuthorized()) {
        return new ModelAndView("redirect:/recommender/connect/facebook");
    }
    String account=userBind;
    Long netId = null;
    Transaction tx = graphDatabase.beginTx();
    try {
        User user = facebook.userOperations().getUserProfile();
        Person p = savePerson(user);
        UserProfile up = saveUserProfile(user);
        up.setUser(p);
        userProfileRepository.save(up);
        p.setProfile(up);
        saveSocialInteractions(up);
        saveSocialPreferences(up);
        personRepository.save(p);
        netId=p.getId();
        tx.success();
    } finally {
        tx.close();
    }
    if (account != null) {
        /*
         * Binding di Facebook riuscito.
         */
        listener.onProfileDataCompleted(netId, SNAccountType.Facebook);
        listener.onInteractionsCompleted(netId, InteractionType.Friendship, SNAccountType.Facebook);
        return new ModelAndView("redirect:http://localhost:8080/portal",
                "accountF", account);
    } else {
        //vista opportuna per estrazione avvenuta senza bind
        return new ModelAndView("facebookNoBindExtraction");
    }
}

看着堆栈跟踪错误,似乎我在控制器的这一行遇到了错误:

用户用户 = facebook.userOperations().getUserProfile();

但这很奇怪,因为默认情况下我应该有权获取基本的用户配置文件数据。

注意:与 Facebook 中使用 Graph API 版本 2.3 的旧应用程序相同的代码可以完美运行,但我需要一个用于不同目的的新应用程序,并且不能强制 Facebook 中的新应用程序使用该版本...

这是我得到的堆栈错误....

12:01:16.953 [http-nio-9080-exec-5] 错误 oaccC[.[.[.[dispatcherServlet] - Servlet.service() 用于路径 [] 上下文中的 servlet [dispatcherServlet] 引发异常 [请求处理失败; 嵌套异常是 org.springframework.social.UncategorizedApiException: (#3) 应用程序没有能力进行此 API 调用。] 根本原因 org.springframework.social.UncategorizedApiException: (#3) 应用程序没有能力进行此 API 调用。在 org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleFacebookError(FacebookErrorHandler.java:91) ~[spring-social-facebook-2.0.2.RELEASE.jar:2.0.2.RELEASE] 在 org.springframework。 social.facebook.api.impl.FacebookErrorHandler.handleError(FacebookErrorHandler.java:59) ~[spring-social-facebook-2.0.2.RELEASE.jar:2.0.2.

4

3 回答 3

3

问题出在 PROFILE_FILEDS 中

public User getUserProfile(String facebookId) {
  return graphApi.fetchObject(facebookId, User.class, PROFILE_FIELDS);
}

数组 PROFILE_FIELDS 包含许多字段,并且当我正确理解 spring-social 文档时,Facebook 仅返回您有权查看的字段。但现在发生了一些变化:

$curl "https://graph.facebook.com/v2.5/me?access_token=[access_tokens]&fields=[all_the_fields_from_PROFILE_FIELDS]
{"error":{"message":"(#3) Application does not have the capability to make this API call.","type":"OAuthException","code":3,"fbtrace_id":"Antivssjj1d"}}

$ curl "https://graph.facebook.com/v2.3/me?access_token=[access_token]&fields=id,about"
{"id":"1135898619755433"}

与此同时,我找到了解决方案。反而

User profile = facebook.userOperations().getUserProfile()

我们可以用

User profile = facebook.fetchObject("me", User.class, "id", "name", "link", "email");

//Note: facebook = org.springframework.social.facebook.api.Facebook
//Note: User.class = org.springframework.social.facebook.api.User.class
于 2015-10-12T20:58:42.543 回答
0

即使添加了publish_actions我的应用程序所需的范围,我仍然会收到此错误。我的问题是我需要 Facebook 来审查我的应用程序。如果您的应用是在 2014 年 4 月 30 日之后创建的,并且满足以下一项或多项条件,就会出现这种情况:

  • 您希望您的应用列在 Facebook 应用中心
  • 您想要创建新的或编辑现有的 Open Graph 操作和故事
  • 您的应用要求人们提供任何扩展权限,包括 publish_actions

查看Facebook 登录审核常见问题解答,了解有关审核流程的更多信息。

于 2016-07-11T14:34:35.237 回答
0

或者等待 spring-social-facebook 的更新,仓库中有一个 pull request 待处理:https ://github.com/spring-projects/spring-social-facebook/pull/171

更新:为我修复2.0.3.RELEASE版本。

于 2015-10-16T23:16:43.787 回答