2010-10-29 4 views
4

Je veux vérifier les permissions d'un utilisateur connecté avant de présenter le login iframe pour demander des perms étendues, mais la popup iframe est bloquée par le navigateur (ff, chrome testé). Je veux éviter cela et je suis assez certain que c'est parce que les résultats des fonctions js sont «imbriqués» - mon intelligence est limitée, alors excusez-moi.Facebook JS SDK: Vérifier les autorisations avant Connexion PopUp

Je suppose que si je peux tout conserver dans la fonction d'origine sans répercuter les résultats, les navigateurs verront toujours l'iframe de connexion comme 'initié par l'utilisateur' et ne pas bloquer.

Mais je suis incapable de le faire - par ex. pourquoi le résultat suivant dans data = undefined.

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

Mon code actuel est plein:

<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> 

Répondre

8

youpi! Le même problème de problème (enfin pas le même problème mais la même fonctionnalité désirée) m'a beaucoup troublé mais finalement après des HEURES de Recherche sur différentes sources j'ai trouvé une solution !!

1er

var data = FB.api(

cela est faux! Parce que toutes les requêtes fb sont exécutées de manière asynchrone et que le seul moyen de récupérer les valeurs de données est dans cette requête après son exécution. ex

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 Votre demande la permission pop-up est bloquée par le chrome pour des raisons de sécurité (Firefox permet d'autres navigateurs demander d'autoriser ou non)

« Un pop-up ne peut être autorisé si son ouvert de un événement d'action utilisateur tel que .onclick " Vous pouvez donc attacher la fonction à un événement .onclick à autoriser.

3 Ma solution pour vérifier si un utilisateur dispose des autorisations nécessaires pour utiliser votre application est:

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

requestPermisions proceedure 
} 

Cette fonction vérifie si un utilisateur est connecté et a donné des autorisations à votre application autre façon Response.Status = "inconnu" est renvoyé.

maintenant ....

L'autorisation problème de bloc pop-up a 2 solutions.

Première solution = attacher la fonction FB.login() à un événement onclick d'un bouton.Ex.

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

2ème solution et celui que je mis en œuvre est redirigeant l'iFrame, vers une page d'autorisation de demande, et non pop up

ci-dessous est une solution complète, qui vérifie si l'utilisateur est connecté et accordé perms. ..si pas demande à l'utilisateur de se connecter et demande ensuite des autorisations (si connecté demandez perms) (si a perms juste ouvre une session)

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 change les navigateurs uRL et pas le iframe's url

// Cette URL est spécialement conçue pour demander des permanentes pour votre application.Vous modifiez les autorisations et votre appID

// redirect_uri = Modifier ceci à votre toile application Page

  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";}});}; 
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(); 
    } 
}); 

Fonction pour ouvrir pop-up pour se connecter à Facebook et d'autorisation.

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 
} 
Questions connexes