Usando o PHP ou JavaScript Facebook SDK, como posso manter o usuário logado no meu site?

Estou usando o SDK do PHP do Facebook para registrar usuários no meu site, assim:

 "myAppID", "secret" => "mySecret", )); $user = $facebook->getUser(); if ($user) { try { // user is authenticated $user_profile = $facebook->api("/me"); } catch (FacebookApiException $ex) { $user = null; } } if ($user) { $logoutURL = $facebook->getLogoutUrl(); ?> <img src="https://graph.facebook.com//picture" /> <a href="https://stackoverflow.com/questions/7135474/using-the-php-or-javascript-facebook-sdk-how-can-i-keep-the-user-logged-in-to-m/">Logout 

<a href="https://stackoverflow.com/questions/7135474/using-the-php-or-javascript-facebook-sdk-how-can-i-keep-the-user-logged-in-to-m/">Login

O problema é que, quando um usuário retorna ao site, eles não estão mais logados e precisam fazer logon novamente.

É possível que os usuários retornados permaneçam logados?


Atualizar:

Minha solução exata acabou por ser uma combinação dos JavaScript e do PHP Facebook SDKs.

O problema é que um cookie não é usado para armazenar as informações de login do Facebook – uma session de PHP é (os cookies de session do PHP expiram quando o navegador está fechado). Além disso, a menos que você tenha access off-line, os tokens de access expiram. Em outras palavras, mesmo se você fosse armazenar o token de access do Facebook em um cookie, ele acabaria por expirar e o usuário seria desconectado.

O JavaScript acabei usando:

  FB.init({ appId: "myAppID", cookie: true, // enable cookies to allow the server to access the session xfbml: true, // parse XFBML oauth: true // enable OAuth 2.0 }); FB.Event.subscribe("auth.login", function(response) { // a user logged in who was not previously logged in window.location.refresh(true); // ideally modify the page with JS rather than refreshing }); FB.Event.subscribe("auth.logout", function(response) { // a user logged out who was previously logged in window.location.refresh(true); // ideally modify the page with JS rather than refreshing }); // check if the user is logged in or not, using the Facebook JS SDK FB.getLoginStatus(null); 

Quando a página é carregada, o Facebook JavaScript SDK verifica com o Facebook para ver se o usuário está logado. Se o usuário estiver logado e o cookie ainda não estiver configurado, ele será configurado. Você pode então atualizar a página (ou, idealmente, modificá-la com JavaScript) e o servidor poderá acessar o cookie usando o SDK PHP comum (e o primeiro pedaço de código nesta questão).

Esta é a melhor maneira que eu encontrei para logins persistentes em sessões de navegação.

Há dois cenários aqui. Uma é autenticar o usuário, e o outro é reconhecer o usuário.

O que geralmente acontece quando você usa os methods de login fornecidos a partir de qualquer API do Facebook é que eles verão se o usuário tem uma session indo com o Facebook. Caso contrário, o usuário será solicitado a fazer login para que você possa ver qual usuário é. No seu caso, você deseja que o usuário sempre esteja logado no Facebook. Isso não é realmente possível porque você precisa descobrir qual usuário é. Você pode armazenar um cookie no computador dos usuários com alguns detalhes de reconhecimento. Você precisaria ter permissions off-line para o usuário ou então o usuário terá que estar logado com a API para obter um novo access_token.

Se você quiser meu aconselhamento, você deve usar o método GetLoginStatus da API para verificar se o usuário tem uma session indo com o Facebook. Se o usuário não estiver logado no Facebook, não é demais para exigi-los para fazer login no seu site. A maioria dos usuários que usam o Facebook tem seu login armazenado para que eles sempre tenham uma session sempre que seu navegador estiver aberto.

Isso seria / é o melhor caminho a seguir, uma vez que não exige que você pergunte aos usuários por permissions offline que eu suponho que muitos usuários não gostariam de dar. Se, por algum motivo, você não pode usar essa abordagem, sugiro obter permissão off-line e depois armazenar um cookie em seu computador sem timer, portanto não será excluído automaticamente.

Desculpe pela parede do texto, mas espero ser um pouco útil 🙂