«

»

mar 03

Facebook Access Token Expirado | Inválido

Facebook Access Token Expirados - Como Manipular

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

Sobre o autor

Tarcísio

Bacharel em Engenharia da Computação, programador C / C++ , especialista em PHP, MySQL, PostgreSQL.

1 comentário

  1. erisom almeida

    deu para tirar algumas duvidas ,logo mais sou novo no mundo das programação ..obrigado

Deixe uma dúvida, resposta ou sugestão