5

そのため、Facebook JSSDKでGraphAPIを使用しようとすると、Safariで次のエラーが発生します。

「OAuthException:現在のユーザーに関する情報を照会するには、アクティブなアクセストークンを使用する必要があります。」

SafariがxドメインのCookie設定に非常に厳しいという事実に関係しているのではないかと思ったので、Firefoxでcookieオプションをfalseに設定して試してみましたFB.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()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 を作成または使用できないことです... ユーザーが最初に操作しない限り。問題は Webkit ではなく Safari 固有の問題なので、Chrome で問題ありません。

私自身この問題に遭遇した後 (数回の苦痛な時間)、良い回避策と思われる解決策があります。この手法は、javascript を使用してフォームをページ本文に挿入し、送信イベントをトリガーすることです。Safari はこれをユーザーの操作として受け入れ、Cookie を許可します。

ここの Facebook 開発者フォーラムで良い例を見つけることができます。

于 2011-02-01T15:36:47.123 に答える