web-dev-qa-db-fra.com

Facebook Oauth Déconnexion

J'ai une application qui s'intègre à Facebook en utilisant Oauth 2.

Je peux autoriser avec FB et interroger très bien leurs API REST et Graph, mais lorsque j'autorise une session de navigateur active est créée avec FB. Je peux alors me déconnecter de mon application sans problème, mais la session avec FB persiste, ainsi, si quelqu'un d'autre utilise le navigateur, il verra le compte FB de l'utilisateur précédent (à moins que l'utilisateur précédent ne se déconnecte manuellement de FB également).

Les étapes que je prends pour autoriser sont:

  1. Appelez [LINK: graph.facebook.com/oauth/authorize?client_id ...]

Cette étape ouvre une fenêtre de connexion/connexion Facebook si le navigateur de l'utilisateur ne dispose pas déjà d'une session FB active. Une fois connectés à Facebook, ils redirigent vers mon site avec un code que je peux échanger contre un oauth jeton.

  1. Appelez [LINK: graph.facebook.com/oauth/access_token?client_id ..] avec le code de (1)

Maintenant, j'ai un jeton Oauth et le navigateur de l'utilisateur est connecté à mon site et au FB.

  1. J'appelle un groupe d'API pour faire des choses: c'est-à-dire [LINK: graph.facebook.com/me?access_token= ..]

Disons que mon utilisateur veut se déconnecter de mon site. Les conditions générales du FB exigent que j'effectue une signature unique. Ainsi, lorsque l'utilisateur se déconnecte de mon site, il le fait également pour Facebook. Il y a des arguments selon lesquels c'est un peu idiot, mais je serai heureux de m'y conformer s'il y a un moyen de le faire.

J'ai vu des suggestions qui:

A. J'utilise l'API Javascript pour me déconnecter: FB.Connect.logout (). Bien, j'ai essayé de l'utiliser, mais cela n'a pas fonctionné, et je ne sais pas comment cela pourrait fonctionner, car je n'utilise en aucun cas l'API Javascript sur mon site. La session n'est pas maintenue ou créée par l'API Javascript, donc je ne suis pas sûr de savoir comment elle est censée l'exprimer.

B. Utilisez [LINK: facebook.com/logout.php]. Cela a été suggéré par un administrateur des forums Facebook il y a quelque temps. L'exemple donné concerne l'ancienne manière d'obtenir des sessions FB (non-Oauth), donc je ne pense pas pouvoir l'appliquer dans mon cas.

C. Utilisez l'ancien REST api expireSession ou revokeAuthorization. J'ai essayé les deux et même s'ils expirent, le jeton Oauth n'annule pas la session le navigateur utilise actuellement, il n'a donc aucun effet, l'utilisateur n'est pas déconnecté de Facebook.

Je suis vraiment un peu perplexe, la documentation de Facebook est inégale, ambiguë et plutôt médiocre. Le support sur les forums est inexistant, pour le moment je ne peux même pas me connecter au forum facebook, et à part cela, leur propre intégration FB Connect ne fonctionne même pas sur le forum lui-même. N'inspire pas beaucoup de confiance.

Ta pour toute aide que vous pouvez offrir. Derek

ps. J'ai dû changer HTTPS en LINK, pas assez de karma pour poster des liens, ce qui est probablement assez correct.

69
Derek Troy-West

Je rencontre le même problème. Je me connecte également avec oauth (j'utilise RubyOnRails), mais pour la déconnexion, je le fais avec JavaScript en utilisant un lien comme celui-ci:

<a href="/logout" onclick="FB.logout();">Logout</a> 

Ceci appelle d’abord la fonction onclick et effectue une déconnexion sur facebook, puis la normale /logout La fonction de mon site s’appelle.

Bien que je préfère également une solution côté serveur, mais au moins, elle fait ce que je veux, elle me déconnecte sur les deux sites.

Je suis également assez novice dans l'intégration de Facebook et y ai joué pour la première fois, mais mon sentiment général est que la documentation est assez répandue dans le monde, avec de nombreux éléments obsolètes.

41
Christoph

Cela fonctionne dès maintenant - et est documenté sur le site de Facebook @ http://developers.facebook.com/docs/authentication/ . Je ne sais pas si cela a été ajouté récemment à la documentation, je suis presque sûr qu'il n'y en avait pas quand j'ai vérifié en février 2012.

Vous pouvez enregistrer par programme l’utilisateur de notre page Facebook en le redirigeant vers

https://www.facebook.com/logout.php?next=YOUR_REDIRECT_URL&access_token=USER_ACCESS_TOKEN

18
russau

Cette solution ne fonctionne plus avec l'API actuelle de FaceBook (il semble que ce n'était pas intentionnel au début)

http://m.facebook.com/logout.php?confirm=1&next=http://yoursitename.com;

Essayez de donner ce lien sur votre lien de déconnexion ou sur le bouton où "yoursitename.com" est l'endroit où vous souhaitez rediriger les personnes après la déconnexion peut être votre page d'accueil.

Ça marche..

18
sumit

Je peux par programme déconnecter l'utilisateur de Facebook en le redirigeant vers

https://www.facebook.com/logout.php?next=YOUR_REDIRECT_URL&access_token=USER_ACCESS_TOKEN

L'URL fournie dans le paramètre suivant doit être une URL avec le même domaine de base que votre application, tel que défini dans les paramètres de votre application.

Plus de détails: https://developers.facebook.com/docs/authentication

10
Tealc Wu

Vous pouvez le faire avec le access_token:

$access_array = split("\|", $access_token);

$session_key = $access_array[1];

Vous pouvez utiliser ce $session key dans le PHP SDK pour générer une URL de déconnexion fonctionnelle.

$logoutUrl = $facebook->getLogoutUrl(array('next' => $logoutUrl, 'session_key' => $session_key));

Ceci met fin à la session facebook du navigateur.

5
Zach Greenberger

Voici une alternative à la réponse acceptée qui fonctionne dans la version actuelle (2.12) de l'API.

<a href="#" onclick="logoutFromFacebookAndRedirect('/logout')">Logout</a>

<script>
    FB.init({
        appId: '{your-app-id}',
        cookie: true,
        xfbml: true,
        version: 'v2.12'
    });

    function logoutFromFacebookAndRedirect(redirectUrl) {
        FB.getLoginStatus(function (response) {
            if (response.status == 'connected')
                FB.logout(function (response) {
                    window.location.href = redirectUrl;
                });
            else
                window.location.href = redirectUrl;
        });
    }
</script>
1
Pluc

Avec PHP je fais:

<a href="?action=logout">logout.</a>

if(isset($_GET['action']) && $_GET['action'] === 'logout'){
    $facebook->destroySession();
    header(WHERE YOU WANT TO REDIRECT TO);
    exit();
}

Fonctionne et est agréable et facile, je suis juste en train d'essayer de trouver un graphique de bouton de déconnexion maintenant!

1
Mike Wells

Update: Cette solution fonctionne et un simple appel à 'FB.logout ()' ne fonctionne pas car le navigateur souhaite qu'une interaction utilisateur appelle réellement cette fonction, de sorte qu'elle sache qu'il s'agit d'un utilisateur et non d'un script.

<a href="#" onclick="FB.logout();">Logout</a> 
0
halkujabra

Une note pour la réponse de Christoph: Facebook Oauth Déconnexion La fonction de déconnexion nécessite la spécification d'une fonction de rappel et échouera sans cette fonctionnalité, du moins sur Firefox. Chrome fonctionne sans le rappel.

FB.logout(function(response) {});
0
zoli

Pour les développeurs Python qui souhaitent déconnecter l'utilisateur directement du backend

Au moment où j'écris ceci, l'astuce avec m.facebook.com ne fonctionne plus (du moins pour moi) et l'utilisateur est redirigé vers la page de connexion du FB mobile, ce qui n'est évidemment pas bon pour UX .

Heureusement, FB PHP Le SDK a un solution semi-documentée) (si le lien ne mène pas à la fonction getLogoutUrl(), il suffit de chercher, de chercher Ceci est également mentionné dans au moins un autre sur StackOverflow: problème de getLogoutUrl () avec Facebook php SDK .

BTW, je viens de remarquer que Zach Greenberg a bien compris dans cette question, mais j’ajoute ma réponse sous forme de résumé pour Python développeurs.

0

@Christoph: il suffit d'ajouter quelque chose. Je ne pense pas que ce soit une façon correcte de se déconnecter des deux endroits en même temps (<a href="/logout" onclick="FB.logout();">Logout</a>).

Just add id to the anchor tag . <a id='fbLogOut' href="/logout" onclick="FB.logout();">Logout</a>



$(document).ready(function(){

$('#fbLogOut').click(function(e){ 
     e.preventDefault();
      FB.logout(function(response) {
            // user is now logged out
            var url = $(this).attr('href');
            window.location= url;


        });
});});
0
Sohail

la solution mobile proposée par Sumit fonctionne parfaitement pour AS3 Air:

html.location = "http://m.facebook.com/logout.php?confirm=1&next=http://yoursitename.com"

0
shi11i