4

iframeログインを提示して拡張パーマを要求する前に、ログインしているユーザーのアクセス許可を確認したいのですが、iframeポップアップがブラウザーによってブロックされます(ff、クロムテスト済み)。私はこれを避けたいと思っています。js関数の結果が「ネスト」されているので、かなり確信しています。私のjsの賢さは限られているので、すみません。

結果を渡さずにすべてを元の関数に保持できれば、ブラウザーはログインiframeを「ユーザーが開始した」と見なし、ブロックしないと推測しています。

しかし、私はこれを行うことができません-たとえば、次の結果がdata=undefinedになるのはなぜですか。

var data = FB.api(
{
method: 'fql.query',
query: 'SELECT create_event FROM permissions WHERE uid=' + response.session.uid
 });
alert(data); // = undefined

私の現在の完全なコードは次のとおりです。

<button id="myButton" >Test Publish Event</button>

<script>

$('#myButton').bind('click', function() {

FB.getLoginStatus(function(response) {

if (response.session) {
// logged in and connected user, someone you know

FB.api(
  {
    method: 'fql.query',
    query: 'SELECT create_event FROM permissions WHERE uid=' + response.session.uid
  },
  function(response) {
        if(response[0].create_event == 1) {
                alert('permission granted');
        } else {
            alert('permission absent');

    FB.login(  function(response) {if (response.session) {
        handleSessionResponse(response);
        if (response.perms) {
          // user is logged in and granted some permissions.
          // perms is a comma separated list of granted permissions
          alert(response.perms);
            } else {
          // user is logged in, but did not grant any permissions       
        }
      } else {
        // user is not logged in
      }
    }, {perms:'create_event,rsvp_event'});

    }
  }
);
</script>
4

2 に答える 2

8

わーい !同じ問題の問題(同じ問題ではありませんが、同じ機能が必要です)は私を大いに悩ませましたが、最終的にさまざまな情報源に関する何時間もの調査の後、解決策を見つけました!!

1位

var data = FB.api(

これは間違っています!すべての fb リクエストは非同期で実行され、データ値を取得する唯一の方法は、実行後のリクエスト内にあるためです。元

FB.api(
{
method: 'fql.query',
query: 'SELECT create_event FROM permissions WHERE uid=' + response.session.uid
 },function(response){
This function will run after the request is finished and ONLY inside here you can read the results data
ex  alert(response.data);
});         
  }
});

2番目のあなたの許可リクエストのポップアップは、セキュリティ上の理由からクロムによってブロックされています(Firefoxは、他のブラウザが許可するかどうかを尋ねることを許可します)

「.onclickなどのユーザーアクションイベントから開かれた場合にのみ、1つのポップアップを許可できます」したがって、関数を.onclickイベントにアタッチして許可することができます。

3番目 ユーザーがアプリを使用するために必要な権限を持っているかどうかを確認するための私の解決策は次のとおりです。

 FB.getLoginStatus(function(response) {
 if (response.status.toString().indexOf("connected")>-1) {
    initAll();
  } else {

requestPermisions proceedure
 }

この関数は、ユーザーが接続されていて、別の方法でアプリにアクセス許可を与えているかどうかを確認します。 response.status = "unknown" が返されます。

今....

許可ポップアップ ブロックの問題には 2 つの解決策があります。

1 番目の解決策 = FB.login() 関数を button.Ex の onclick イベントにアタッチします。

     ifUserNotgrandedPermisions{document.getElementByid("aLogInButton").onclick = function(){
 FB.login(....blah blah blah);
 };

2番目のソリューションと私が実装したソリューションは、iFrameをリクエスト許可ページにリダイレクトし、ポップアップしないことです

以下は、ユーザーがログインして権限を付与されているかどうかを確認する完全なソリューションです...そうでない場合は、ユーザーにログインするように求め、次に権限を要求します(ログインしている場合は権限を要求するだけです)(権限があればログインするだけです)

    FB.init({appId: 'YourAPPID', status: true, cookie: true, xfbml: true, oauth : true});
    FB.getLoginStatus(function(response) {
   if (response.status.toString().indexOf("connected")>-1) {
     initAll(); //User is connected and granted perms Good to go!
   } else { 

//top.location は iframe の URL ではなくブラウザの URL を変更します

//この URL は、アプリのパーマを要求するために特別に形成されています。アクセス許可と appID を変更します

//redirect_uri = これをアプリケーション キャンバス ページに変更します

          top.location=window.location="http://www.facebook.com/dialog/oauth/?scope=read_stream,publish_stream,friends_photos,friends_activities&client_id="yourAPPID(nobrackets)"&redirect_uri=http://apps.facebook.com/filtered_feed/&response_type=code";}});};
于 2011-09-22T22:59:19.060 に答える
1
FB.init({
   appId: 'YOUR APP ID', 
   status: true, 
   cookie: true,
   xfbml: true,
   oauth : true
});
FB.getLoginStatus(function(response) {
  if (response.status === 'connected') {
    /*var uid = response.authResponse.userID; //FACEBOOK_ID
    var accessToken = response.authResponse.accessToken;*/ //ACCESS TOKEN
    FB.Canvas.setAutoResize();
    if (response.authResponse) {
        // logged in and connected user, someone you know. 
        //  YOUR SUCCESS CODE HERE
    }
  }else {
      attemptLogin();
  }
 });

facebook へのログインと認証のためのポップアップを開く機能。

function attemptLogin(){
   FB.login(function(response) {
      if (response.authResponse) {
          login();
        } else {
          //if user didn't logged in or didn't authorize your application
      }
  }, {scope: 'offline_access,publish_stream,manage_pages'}); //YOUR PERMISSION
}
于 2012-01-06T11:11:18.773 に答える