Fwd: Access Token Session Expires - Facebook SDK

324 views
Skip to first unread message

Carlos Filho

unread,
May 24, 2012, 3:53:38 PM5/24/12
to php-ar...@googlegroups.com
Recentemente o Facebook teve a brilhante ideia de remover da API o "offline_access", que permitia access_tokens com tempos muito altos de persistência. No entanto, essa permissão foi removida e será gradualmente desabilitada para as apps antigas. 

Estou com um problema simples, mas que não tem uma solução óbvia: como fazer pra pegar um novo access_token sem mostrar o popup pro usuário? Ou seja, via php-sdk?

Li algo a respeito aqui, aqui e aqui. Um cidadão fez um gato na sdk e adicionou a offline_access, mas não resolve o problema, porque logo o Facebook fará o favor de desativar essa permissão.

Pra testarem o que estou dizendo, basta fazerem login pela app e guardar o access_token (pode ser até via JS), depois testem nessa url: https://graph.facebook.com/me?access_token=SEU_ACCESS_TOKEN

Deixem algum tempo inativo (cerca de 2h) e vejam que logo ele lançará uma exceção: 
error: {
    type: "OAuthException",
    message: "Session has expired at unix time 
      SOME_TIME. The current unix time is SOME_TIME.”
  }, 

E isso impede que um usuário execute uma ação, como por exemplo, postar o que está ouvindo ou o que está lendo através da API. O que me deixa muito enfurecido é que o usuário já deu as permissões e eventualmente pode estar logado na minha app, mas não vai conseguir executar uma ação por conta dessa sessão expirada.

Se eu não fui claro o suficiente na dúvida, por gentileza, peçam mais detalhes. Alguém passou por isso e resolveu?

-- 
Carlos Filho

Lucas Arruda

unread,
May 24, 2012, 4:20:12 PM5/24/12
to php-ar...@googlegroups.com
Estou meio incrente que eles tomara uma decisão aparentemente tão tola sem ao menos ter algo para prevenir/circunvir.

Eu entro em aplicativos com o Zynga poker a muito tempo sem ter oferecido minhas credenciais e ele está sempre "logado" no facebook. Eventualmente se ficar muito tempo, ele "desloga". Como será que empresas desse porte, como a Zynga, vão lidar com isso. Ficar pedindo autorização no FB toda vez que eu entrar no aplicativo? Estranho, não?


[]'s
Lucas Arruda
lucasarruda.com



2012/5/24 Carlos Filho <carlos...@gmail.com>

Carlos Filho

unread,
May 24, 2012, 4:38:03 PM5/24/12
to php-ar...@googlegroups.com
Exatamente, mas como você pode ver aqui, o martelo já foi batido.

--
Carlos Filho

Diego Henrique Oliveira

unread,
May 24, 2012, 4:40:25 PM5/24/12
to php-ar...@googlegroups.com
O offline_access é pra app fora do navegador, como scripts de linha de comando e coisas do tipo. Ou seja, é pra ser acessado quando o usuário não está logado. Resumo: vc não precisa dele pro seu site, e a decisão de remove-lo foi certa por parte do FB, ja que isso abria a possibilidade de alguma app tomar uma decisão por mim sem eu saber.


Uma vez que o usuário loga na sua aplicação, basta ele logar no FB pra sua app também estar autorizada. E outra coisa, recomendo demais você ler a documentação da SDK JS: https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/
É ela que reconhece os cookies do FB e gera cookies pra sua app pra que o processo de login seja transparente pro usuário.

Outra coisa, não use só a PHP-SDK, use a JS SDK em conjunto com a PHP-SDK. As duas juntos resolvem todos os seus problemas :)


Diego Oliveira





2012/5/24 Lucas Arruda <lucas...@gmail.com>

Lucas Arruda

unread,
May 24, 2012, 5:18:42 PM5/24/12
to php-ar...@googlegroups.com
Agora está explicado.

Obrigado pelo esclarescimento, Diego!


[]'s
Lucas Arruda
lucasarruda.com



2012/5/24 Diego Henrique Oliveira <con...@diegoholiveira.com>

Carlos Filho

unread,
May 24, 2012, 5:29:25 PM5/24/12
to php-ar...@googlegroups.com
Diego, obrigado pela resposta. Mas no meu caso, o usuário está num fórum de discussões e para compartilhar o post/discussão via Facebook ele não precisaria mais se autenticar novamente, uma vez que já deu as permissões e marcou, por exemplo, um checkbox para postar em seu nome. 

Também uso o JS SDK para algumas coisas mais triviais, mas nesse caso, é muito inconveniente, entende? Estou procurando uma solução que não obrigue o usuário clicar em nada e que o faça ver aquele popup maluco abrindo e fechando a cada post ou reply.

-- 
Carlos Filho

Diego Henrique Oliveira

unread,
May 24, 2012, 5:38:25 PM5/24/12
to php-ar...@googlegroups.com
Mas Carlos, ele não vai precisar autenticar novamente pra isso.

Eu uso a FB SDK e o usuário só loga uma vez, e a partir disso ele faz tudo sem precisar logar novamente. Inclusive se o usuário salvou a autenticação dele no FB, nunca mais ele precisa autenticar na minha app também. Pra detectar se o usuário está logado ou não, eu fiz esse script JS que é executado sempre que uma página é carregada: https://gist.github.com/b39d4963f6012d6692ca

Dá uma olhada nele que é possivel que esta mesma solução sirva pra você com poucas alterações.


Abraços





2012/5/24 Carlos Filho <carlos...@gmail.com>

Carlos Filho

unread,
May 24, 2012, 8:09:24 PM5/24/12
to php-ar...@googlegroups.com
Diego,

Fiz o teste hoje e obtive o resultado esperado: meu tempo de sessão de login é maior que duas horas, que é o padrão do access_token, dessa forma, mesmo logado, a API lança uma exceção dizendo que o token é inválido. Vou testar sua solução também, pode ser que consigo abrir a mente pra esse problema. De qualquer forma, muito obrigado.

Abraço,

--
Carlos Filho

Carlos Filho

unread,
May 25, 2012, 2:32:01 PM5/25/12
to php-ar...@googlegroups.com
Diego,

Você habilitou o offline_access na sua app? Se não, sua app interaje via Facebook normalmente mesmo depois de 2h de inatividade? Estou realmente curioso pra saber como você fez, porque meu problema não é login, mas sim postar no mural do usuário ao longo da sessão dele no meu site.

Imagine a seguinte situação: a sessão de login do usuário no fórum dura 1 dia; quando ele entra via Facebook, via API (JS + PHP), ele é logado e recebe um access_token que dura, em média de 1 a 2 horas; no entanto, após esse período de inatividade, ele resolve abrir uma nova discussão e postá-la no Facebook, mas não conseguirá, porque a OAuth vai lançar aquela exceção que mostrei anteriormente.

Em face disso, tenho duas alternativas: ou fazer com que o popup de login abra novamente no clique de um checkbox "Postar no meu mural" via JS pelo método FB.login() ou fazer isso internamente, pela SDK, não obstrusivamente e sem popups, que no caso acho muito mais conveniente e elegante.

A primeira solução eu tenho, mas é ruim, caso o usuários esteja em um dispositivo móvel com baixa interação com o JS, que geralmente quebra. Por isso a necessidade de fazer internamente. Eu poderia até diminuir o tempo de sessão para logins no Facebook, mas isso não compete a minha decisão, se é que me entende.

--
Carlos Filho

Diego Henrique Oliveira

unread,
May 25, 2012, 2:39:13 PM5/25/12
to php-ar...@googlegroups.com


2012/5/25 Carlos Filho <carlos...@gmail.com>

Diego,

Você habilitou o offline_access na sua app?

Não.

 
Se não, sua app interaje via Facebook normalmente mesmo depois de 2h de inatividade?

Sim. Lembre-se que em TODAS as páginas do meu projeto aquele código JS que te passei é carregado novamente, validando o token novamente pelo proprio FB. 

 
Estou realmente curioso pra saber como você fez, porque meu problema não é login, mas sim postar no mural do usuário ao longo da sessão dele no meu site.

Eu não tive esse problema.

 

Imagine a seguinte situação: a sessão de login do usuário no fórum dura 1 dia; quando ele entra via Facebook, via API (JS + PHP), ele é logado e recebe um access_token que dura, em média de 1 a 2 horas; no entanto, após esse período de inatividade, ele resolve abrir uma nova discussão e postá-la no Facebook, mas não conseguirá, porque a OAuth vai lançar aquela exceção que mostrei anteriormente.

Em face disso, tenho duas alternativas: ou fazer com que o popup de login abra novamente no clique de um checkbox "Postar no meu mural" via JS pelo método FB.login() ou fazer isso internamente, pela SDK, não obstrusivamente e sem popups, que no caso acho muito mais conveniente e elegante.

como assim pela SDK? Qual SDK?

Eu sempre uso a SDK JS o máximo possível, deixando pra usar a SDK PHP pouco, pra te falar a verdade só tem um cenário que eu uso a SDK do PHP: no cadastro do usuário. Tirando isso, só uso aquele código que te forneci para validar a sessão do cara nas páginas protegidas. 

Carlos Filho

unread,
May 25, 2012, 4:07:55 PM5/25/12
to php-ar...@googlegroups.com
Então você respondeu minha dúvida: toda página acessada dá um refresh no token. Agora sim, tá explicado.


Diego, obrigado pelos esclarecimentos. Vou testar sua solução.

Abraço.
--
Carlos Filho

Reply all
Reply to author
Forward
0 new messages