Há um tempo, publiquei um artigo aqui no DigitalDev mostrando como construir um aplicativo para Facebook usando linguagem de programação PHP. Tal artigo é até hoje um dos mais acessados, com muitos comentários e dúvidas, porém, identifiquei que muita gente tem problemas com Facebook Access Token Expirados por algum motivo. Mas quando o Access Token Expira? O que fazer quando isso acontece? Procurando por essas respostas, achei um artigo em Inglês no blog do Facebook Developers e resolvi trazer as informações lá contidas para você, em Português.
Por que o Facebook Access Token expira
Existem alguns motivos aos quais levam um Access Token se tornar inválido. Na maioria dos casos, a razão é o tempo de vida do mesmo, que por padrão é de 2 (duas) horas. Ele pode se expirar também se o usuário efetuar uma mudança de senha, efetuar log-off ou desautorizar o acesso do aplicativo à sua conta via App Dashbord do próprio Facebook. Se o Access Token que seu aplicativo estiver tentando usar expirar, você precisará adquirir um novo.
Cenário 1 – Facebook Access Token Expirando por tempo
Como eu já havia dito, na maioria das vezes o token se torna inválido porque estourou seu tempo de vida de 2 duas horas. A API do Facebook retorna o status HTTP 400 com os seguinte erro mostrado abaixo.
{ error: { type: "OAuthException", message: "Session has expired at unix time SOME_TIME. The current unix time is SOME_TIME.” }, }
Mensagem de erro do cenário
Session has expired at unix time DATA_E_HORA. The current unix time is DATA_E_HORA.
Tradução Livre – A sessão expirou em DATA_E_HORA. A hora atual é DATA_E_HORA.
Cenário 2 – Usuário efetua troca de senha
Esse senário se refere ao caso do usuário ter autorizado seu aplicativo no passado, mas ter trocado a senha da conta do Facebook. Nesse caso, quando o SDK tentar efetuar a requisição à API do Facebook, receberá novamente um status HTTP 400 com os seguinte erro mostrado abaixo.
{ error: { type: "OAuthException", message: "The session has been invalidated because the user has changed the password.", }, }
Mensagem de erro do cenário 2
The session has been invalidated because the user has changed the password.
Tradução Livre – A sessão foi invalidada porque o usuário mudou a senha.
Se seu usuário alterou a senha da conta do Facebook, você irá receber esta mensagem, mesmo que seu aplicativo tenha a permissão offline_access à conta.
Cenário 3: Usuário desautorizou seu aplicativo
Isso acontece quando o usuário foi até o App Dashboard do Facebook e pediu para que a rede social revogasse o acesso do seu aplicativo à conta dele. Nesse caso, você receberá novamente um status HTTP 400, com o seguinte erro.
{ error: { type: "OAuthException", message: "Error validating access token: USER_ID has not authorized application APP_ID", }, }
Mensagem de erro do cenário 3
Error validating access token: USER_ID has not authorized application APP_ID
Tradução Livre – Erro ao validar token de acesso: Usuário não autorizou o aplicativo xxxx.
Se seu usuário desautorizou o acesso do seu aplicativo à conta dele, você irá receber esta mensagem, mesmo que seu aplicativo tenha a permissão offline_access à conta.
Cenário 4: Usuário efetuou logoff do Facebook
Se quando seu aplicativo efetuou o pedido de acesso à conta do usuário, você não incluiu o pedido para acesso off-line “offline_access”, seu aplicativo só terá acesso à conta do mesmo enquanto ele estiver logado no Facebook. Se o mesmo clicar no botão sair, seu aplicativo perderá a permissão de acesso à conta, e retornará que o Facebook Access Token não é mais válido, como mostrado abaixo.
{ "error": { "type":"OAuthException","message":"Error validating access token: The session is invalid because the user logged out." } }
Mensagem de erro do cenário 4
The session is invalid because the user logged out.
Tradução Livre – A sessão é inválida porque o usuário efetuou logout.
Para quem leu o artigo Comunicando-se com o Facebook usando PHP, a solução para esse problema segue abaixo
/* Envia para a página de permissão do facebook, nela voce irá dar permissão ao aplicativo acessar dados da sua conta */ $url = $facebook->getLoginUrl ( array ( 'scope' => array('publish_stream','read_stream','offline_access') ) ); header("Location:".$url);
Solução para todos os cenários
Para melhorar a experiência do usuário, seu aplicativo precisa estar preparado para tratar os erros mostrados nos cenários acima e, quando necessário, efetuando uma requisição de um novo Facebook Access Token válido.
Quando você redirecionar um usuário para a página de autenticação, caso ele já tenha permitido que seu aplicativo acesse sua conta, o Facebook não perguntará sobre quais permissões o aplicativo terá a sua conta e retornará automaticamente um novo Access Token válido. Claro que se o usuário desautorizar o aplicativo, ele terá que efetuar o fluxo completo de autorização novamente.
No caso do Facebook SDK em PHP, ele lança uma exceção ( FacebookApiException ) cada vez que um problema com o Access Token acontece. Com isso, você só precisa tratar a tal exceção e redirecionar o usuário à página de autenticação. Veja o exemplo abaixo.
//criando função de para redirecionar ao login function login() { $url = $facebook->getLoginUrl ( array ( 'scope' => array('publish_stream','read_stream','offline_access') ) ); header("Location:".$url); } //verificando se o usuário já está logado $o_user = $facebook->getUser(); /* quando o usuário não está logado o $o_user é 0 */ if($o_user == 0) login(); else { //requisitando os posts da home do usuário try { $home = $facebook->api('/me/home'); var_dump($home); } catch( FacebookApiException ) { //caso a Exceção seja capturada, redireciona para o login login(); } }
E é isso ai, um exemplo básico de como trabalhar com Facebook Access Token Expirados ou Inválidos. Espero ter conseguido ajudar aos que estavam com problemas. Mas se você ainda tiver qualquer dúvida sobre o assunto, use a área de perguntas e respostas abaixo do post, eu ficarei feliz em responder.
Fonte: How-To: Handle expired access tokens
3 comentários
deu para tirar algumas duvidas ,logo mais sou novo no mundo das programação ..obrigado
Eu não consigo mais entrar no mensager do meu facebook da erro
onde coloco esse código:
?