FB.login com PHP API

Eu configurei uma página de canvas que é um FB.login clicando em um botão de envio de formulário. Durante a seguinte solicitação, ele tenta acessar os dados dos usuários por meio de $ facebook-> api (‘/ me’) (última versão da API do Github). Funciona no Firefox e no Chrome, mas não no Safari e no IE, onde a API falha com o “token de autenticação necessário”. Alguém já teve esse problema ou teve uma idéia do que poderia causar?

BR Philipp

editar:

Eu chamo FB.login dentro do evento de clique de um botão de envio de formulário:

$('.form-submit', this).click(function() { FB.getLoginStatus(function(response) { if (response.session) { form.submit(); } else { FB.login(function(response) { if(response.session && (permissions == '' || response.perms)) { form.submit(); } else { } },{perms:permissions}); } }); return false; }); 

No lado do servidor, simplesmente construa o object php-api e tente obter dados do usuário:

 $facebook = new Facebook(array( 'appId' => $appid, 'secret' => $appsecret, 'cookie' => TRUE, )); if ($facebook) { try { $me = $api->api('/me'); } catch (Exception $exc) { // Failure in Safari and IE due to invalid auth token } } 

O firm_request é passado dentro de um elemento de formulário oculto.

Eu tive muitos problemas com as coisas de login do JS FB. Eu recomendo usar o login de redirecionamento mais simples usando oauth e a function getLoginUrl de php fb api.

Então, basicamente, você faz isso com o PHP, você verifica se você tem sua session, se você não usar getLoginUrl e redirect para essa página, seu uso será redirecionado para seu aplicativo / site com uma session válida (se ele aceita).

Isso ajuda? Eu realmente perdi HOURS tentando fazer o login do FB JS funcionar em qualquer navegador e não pude, eu troquei desde então para o método de login de redirecionamento simples em todas as minhas aplicações com total sucesso.

Eu tive o mesmo problema e incluí uma solução abaixo.

Eu acredito que o motivo pelo qual isso acontece é porque, em uma tentativa de login no JavaScript, seu servidor nunca recebe nenhum tokens de access. O Javascript está apenas a transmitir dados entre o seu navegador e Facebook.com para que seu servidor não tenha idéia do status de autenticação. Seu servidor só receberá os novos tokens de access quando a página for atualizada; É aqui que o Facebook entrega os tokens de access.

Sua solução é minha. Após um login bem-sucedido via FB.login você receberá o object de resposta e dentro dele é um access_token. Tudo o que você precisa fazer é passar este token de access ao seu script de alguma forma. Aqui está um exemplo:

 // Hold the access token var js_access_token = ""; // Connect to facebook FB.login(function(response) { if (response.session) { if (response.perms) { // user is logged in and granted some permissions. // Save the access token js_access_token = response.session.access_token; // Do stuff on login } } }); 

Em seguida, você inclui o token de access junto com todos os pedidos. Eu escolhi um exemplo do ajax.

 // Communication back to server. $.ajax({ url: 'myurl.php', data: { js_access_token: js_access_token // Including the js_access_token }, success: function(data) { console.log(data); } }); 

Dentro do seu PHP, você precisa ter algo que se pareça com isto:

 $facebook = new Facebook(array( 'appId' => $appid, 'secret' => $appsecret, 'cookie' => TRUE, )); if ($facebook) { // If we get the access token from javascript use it instead if (isset($_REQUEST['js_access_token']) && $_REQUEST['js_access_token']) { $facebook->setAccessToken($_REQUEST['js_access_token']); } try { $me = $api->api('/me'); } catch (Exception $exc) { // Failure in Safari and IE due to invalid auth token } } 

Espero que isto ajude

Eu gostei da resposta de Conor, pois eu tinha que passar o meu token de access do lado do cliente para o lado do servidor, pois não estava funcionando no Safari (problemas de cookies que presumo). Mas esta é uma pergunta antiga, então algumas coisas tiveram que mudar. Os vars são diferentes agora e, como a Oliland apontou, não devemos enviar tokens de access como GET params.

De qualquer forma, aqui está o que acabei no caso de ajudar alguém

 Start 

e então no PHP, muito parecido com a resposta de Conor, mas obtendo o token do $ _POST var.