5

因此,我尝试将 Graph API 与 Facebook JS SDK 一起使用,但在 Safari 中出现以下错误:

“OAuthException:必须使用活动访问令牌来查询有关当前用户的信息。”

我怀疑这与 Safari 对 x-domain cookie 设置非常严格这一事实有关,所以我在 Firefox 中尝试了它,cookieFB.init(). 我确实发现我的FB.api()请求遇到了同样的错误。

FB.init({
  appId:  "<%= app_id %>",
  status: true, // check login status
  // We cannot rely on this cookie being set in an iframe. I found this
  // out because the Graph API was not working in Safari.
  // cookie: true, // enable cookies to allow the server to access the session
  xfbml:  true, // parse XFBML
  channelUrl: window.location.protocol + '//' + window.location.host + '/fb/canvas/channel.html'
});

所以我想知道......有没有一种access_token在请求中手动设置查询参数的好方法FB.api()

如果FB.init()cookie 设置正确,FB.api()请求参数如下所示:

access_token  xxxxxxxxxxxx|1.xxxxxxxxxxxxxxxxxxxxxx__.3600.xxxxxxxxxx-xxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx
callback      FB.ApiServer._callbacks.xxxxxxxxxxxxxxx
pretty        0
sdk           joey

在 Safari 中(或未cookie FB.init()设置该选项时),FB.api()请求参数如下所示:

callback      FB.ApiServer._callbacks.xxxxxxxxxxxxxxx
pretty        0
sdk           joey

现在......显然我的应用程序有能力access_token在服务器端生成......我想知道是否有任何方法可以手动设置FB.api()为使用我的 server-side-generated access_token

4

2 回答 2

4

好的,我开始工作了。我发现您不需要该FB.init() cookie: true选项即可使用FB.api()——您可以手动传递 access_token:

FB.api("/me/apprequests/?access_token="+access_token, function (response) {});

access_token您在页面加载时设置服务器端的 JS 变量在哪里。这是一个 ERB 示例:

<script>
  var access_token = "<%= @access_token %>";
</script>

并且@access_token是在初始 POST 请求中传递到您的画布页面的 oauth access_token。

于 2011-02-01T19:27:27.007 回答
3

Safari 的限制是,如果域与父域不同,它将不允许 iframe 的内容创建或使用 cookie……除非用户首先与其交互。这个问题是 Safari 独有的,而不是 webkit,所以 Chrome 很好。

在我自己遇到这个问题(几次痛苦的时候)之后,有一个解决方案似乎是一个很好的解决方案。该技术是使用 javascript 将表单注入页面正文,然后触发提交事件。Safari 接受此作为用户交互并允许使用 cookie。

您可以在此处的 Facebook 开发者论坛上找到一个很好的示例

于 2011-02-01T15:36:47.123 回答