2011-08-25 1 views
1

J'ai configuré Facebook Connect sur mon site, et la connexion fonctionne correctement. J'ai mis en place un auditeur pour détecter un changement d'état de connexion, comme suit:À quelle fréquence une session Facebook Connect est-elle actualisée?

FB.Event.subscribe('auth.sessionChange', function() { 
     window.location.reload(); 
    }); 

Tout bien. Sauf que laisser une fenêtre de navigateur ouverte provoque le rechargement de la page après peut-être 20 minutes. Ainsi, auth.sessionChange est en train de tirer à un certain intervalle. Ce qui peut causer des ravages, en particulier si la dernière page était une soumission de formulaire POST.

Dans les documents FB, il est écrit "Les sessions sont actualisées au fil du temps tant que l'utilisateur est actif avec votre application." À quelle fréquence cette session est-elle actualisée?

Et comment puis-je protéger la page contre le rechargement si ce n'est pas nécessaire? Un conditionnel peut-être dans cette fonction ??

EDIT - ajouter des informations de clarification:

Je pensais que je voudrais ajouter quelques informations pour donner ceux qui offrent les conseils un peu plus pour aller (merci beaucoup BTW):

la raison pour laquelle je l'écouteur déclenchant un rechargement est parce que je voulais que les utilisateurs soient connectés au site chaque fois qu'ils visitent - s'ils avaient déjà une session dans FB. Je détectais une session active avec le JS SDK, que je sais pouvoir se connecter seul, mais j'avais besoin de déclencher un rechargement de page après que le JS ait fait la détection, afin de définir une session PHP pour le site - requis étape. Je ne pouvais pas faire la connexion PHP sans d'abord laisser le JS détecter la session FB dans le navigateur.

Répondre

0

Habituellement, vous pouvez voir la durée de validité de la session simplement en regardant la session elle-même. Cependant, dans de nombreux cas, je suggère de demander l'autorisation offline_access pour que l'access_token reste valide tant que l'utilisateur ne change pas son mot de passe et ne supprime pas votre application.

+0

Facebook ne le décourage pas, en fait beaucoup d'ingénieurs vous suggèrent de l'utiliser. Mon livre sur la façon de développer des applications Facebook a même eu des extraits sur la façon dont il a été suggéré de l'utiliser dans la majorité des applications, sauf pour ceux qui ont un nombre élevé de pages vues. Ce qu'il fait ci-dessus est probablement un cas où offline_access fonctionne le mieux, sinon l'utilisateur devra rafraîchir la page sur une base beaucoup plus fréquente, comme 10 minutes. –

+0

Demander l'autorisation 'offline_access' juste pour ne pas" doubler "l'envoi d'un formulaire lorsque la page est rechargée n'est pas une bonne raison (du moins pour moi). Bien que cette autorisation puisse être utilisée lorsque l'utilisateur est déjà connecté (même si je ne peux pas penser à un cas), il est destiné aux activités "hors ligne" dont l'application a besoin lorsque l'utilisateur n'est pas connecté à Facebook . – ifaour

+0

Veuillez également noter qu'il y a deux parties dans la question: 1) comment éviter un rechargement (que j'ai suggéré une réponse) 2) à quelle fréquence l'événement est appelé (dont je ne connais pas la réponse) – ifaour

0

Andy, si vous ne faites qu'écouter pour l'état de connexion puis abonnez-vous à auth.login et auth.logout au lieu de auth.sessionChange.

Si vous avez besoin d'une session active pour un utilisateur de prendre une action sur votre site, utilisez FB.getLoginStatus() ou FB.getSession() pour vérifier l'objet de la session.

http://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

http://developers.facebook.com/docs/reference/javascript/FB.getSession/

+0

ne demande pas un événement différent à utiliser! – ifaour

+0

Et quel est le problème de suggérer la bonne façon de faire les choses? – Sid

+0

qui a dit que l'utilisation de 'auth.sessionChange' est incorrecte? – ifaour

-1

Cela dépend vraiment de votre App flux de travail et l'est au-dessous juste une approche générale.

Vous pouvez avoir un drapeau qui présente dans toutes vos pages (peut-être dans votre disposition principale si vous utilisez un système de gabarit) avec une fonction de réglage à exécuter une fois que vous n'avez pas besoin de recharger la page. Quelque chose comme:

var do_reload = true; // By default, we always allow a reload 

FB.Event.subscribe('auth.sessionChange', function() { 
    if(do_reload) { 
     window.location.reload(); 
    } 
}); 

// Call this whenever you don't want 'auth.sessionChange' to reload the page 
function turnoff_reload() { 
    do_reload = false; 
} 

// Call this to return to default behavior 
function turnon_reload() { 
    do_reload = true; 
} 

Maintenant, si vous « redirigez » l'utilisateur (par exemple: après un poste de forme) à une page qui ne nécessite pas un reload alors vous devez définir le drapeau dans la première ligne à false .Un autre scénario si vous avez un contenu chargé par ajax basé sur l'interaction de l'utilisateur, si la page recharge par elle-même ce contenu sera perdu et l'utilisateur doit interagir à nouveau pour afficher ce contenu, ce qui peut être fait ici est le réglage drapeau à false après l'appel Ajax.

+0

Je ne suis pas sûr que la perte de données est quelque chose qui vaut la peine d'être pris en compte dans n'importe quelle application. La convivialité est la clé de toute application ou jeu. –

+0

@Francis, pouvez-vous élaborer s'il vous plaît? – ifaour