Facebook API, Gerando tokens de acesso
Introdução
Neste artigo aprenderemos como gerar tokens de acesso de aplicativos para Facebook. Os tokens de acesso são a maneira no qual a API do Facebook valida a identidade de quem esta realizando o acesso. Qualquer chamada feita na API do facebook precisa de um token. Veremos como gerar tokens de acesso de usuário, aplicativo e página.
Segue uma breve descrição sobre os tipos de tokens:
- Aplicativos: Tokens de acesso de aplicativos permitem ler e modificar configurações dos aplicativos, além de criar e gerenciar usuários de teste. Podemos usar tokens de acesso de aplicativos também para consultar publicações na linha do tempo de grupos e eventos que tem privacidade pública.
- Usuários: Tokens de acesso de usuários são usados para ler, escrever e modificar dados de usuários. Tokens de acesso de páginas podem ser estendidos.
- Páginas: Tokens de acesso de páginas são semelhantes aos tokens de acesso de usuário e são usados para ler, escrever e modificar dados de páginas. Tokens de acesso de páginas também pode ser estendidos.
Preparando o ambiente
É necessário ter uma aplicativo criado na plataforma do Facebook. Você precisará do App ID e App Secret. Caso tenha alguma dúvida de como criar um aplicativo na plataforma do Facebook, consulte o artigo Criando Aplicativos Facebook SDK v5 em PHP.
Para usar os códigos de geração de tokens de usuário e página é necessário a instalação do SDK de Facebook para PHP. Vamos fazer isso através do composer. Baixe a última versão do composer através do link https://getcomposer.org/composer.phar.
Dentro do diretório da sua aplicação facebook crie o arquivo composer.json com o seguinte conteúdo:
{ "require": { "facebook/graph-sdk": "^5.5" } }
Na linha de comando, execute:
$ php composer.phar install
Token de Acesso de Aplicativo
Gerar o token de acesso de aplicativo é bem simples. Tenha em mãos o App ID e o App Secret do aplicativo. O App ID e o App Secret podem ser obtidos na tela do Painel do aplicativo (https://developers.facebook.com/apps). Basta montar a URL conforme abaixo, substituindo os campos App ID e App Secret com os do seu aplicativo. Acesse a URL em um navegador e estará com o token de acesso de aplicativo em mãos.
https://graph.facebook.com/oauth/access_token?
client_id={app-id}
&client_secret={app-secret}
&grant_type=client_credentials
O token de acesso de aplicativo não tem tempo de expiração, é ilimitado. Porém, caso o administrador do aplicativo redefina a chave secreta (App Secret) o token será automaticamente invalidado.
Token de Acesso de Usuário
O token de acesso de usuário é gerado durante o fluxo de Login do Facebook. Caso você já tenha feito um aplicativo usando o fluxo de Login você já gerou um token de usuário.
Para gerar o token de usuário, vamos usar dois arquivos: login.php e fb-callback.php. O login.php irá solicitar o Login do Facebook e as permissões desejadas para o usuário. Ao finalizar o processo de Login, o usuário será redirecionado de volta para a página fb-callback.php. O fb-callback.php se encarregará de estender e exibir o token do usuário.
Por padrão o token de acesso de usuário é de curta duração (cerca de duas horas). Quando estendido o token de acesso de usuário tem um prazo de 60 dias. Sempre que o usuário voltar a sua aplicação pelo fluxo de Login, atualize o seu token para que você sempre tenha um token com expiração no maior tempo possível.
login.php:
<?php session_start(); date_default_timezone_set('America/Sao_Paulo'); // autoloader gerado pelo composer require_once __DIR__ . "/vendor/autoload.php"; // instancia do facebook $fb = new Facebook\Facebook([ 'app_id' => '', 'app_secret' => '', 'default_graph_version' => '' ]); $helper = $fb->getRedirectLoginHelper(); // permissoes $perms = ['email','publish_actions','manage_pages', 'publish_pages']; // siteurl $siteUrl = ""; $loginUrl = $helper->getLoginUrl("$siteUrl/fb-callback.php",$perms); ?> <a href="<?= $loginUrl; ?>">Logar com Facebook!</a>
Lembre-se de parametrizar:
- App ID, App Secret e App Version nas linhas 10, 11 e 12
- As permissões desejadas na linha 17 (no exemplo estou solicitando email, publish_actions, manage_pages e publish_pages)
- $siteUrl na linha 20 (o domínio de onde seu aplicativo esta acessível via web)
fb-callback.php:
<?php session_start(); date_default_timezone_set('America/Sao_Paulo'); // autoloader gerado pelo composer require_once __DIR__ . "/vendor/autoload.php"; // instancia do facebook $fb = new Facebook\Facebook([ 'app_id' => '', 'app_secret' => '', 'default_graph_version' => '' ]); $helper = $fb->getRedirectLoginHelper(); try { $accessToken = $helper->getAccessToken(); if (!$accessToken->isLongLived()) { // token de acesso de curta duração, solicitar um de longa duração $oAuth2Client = $fb->getOAuth2Client(); $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken); } } catch(Facebook\Exceptions\FacebookResponseException $e) { // Erro retornado pela graph api echo 'Graph returned an error: ' . $e->getMessage(); exit; } catch(Facebook\Exceptions\FacebookSDKException $e) { // falha na validacao ou outro tipo de erro echo 'Facebook SDK returned an error: ' . $e->getMessage(); exit; } // exibe o token de acesso extendido echo $accessToken;
Lembre-se de parametrizar:
- App ID, App Secret e App Version nas linhas 10, 11 e 12
As linhas destacadas, 20 – 24, corresponde ao código responsável por estender o token de acesso de usuário.
Para gerar token estendido de usuário basta acessar a aplicação através do caminho http://siteurl/login.php
Token de Acesso de Página
Veremos agora como gerar o token de acesso de página. No caso, somente é possível gerar token de acesso de uma página através de um usuário que seja administrador dela. É necessário também que o usuário tenha concedido a permissão manage_pages. A permissão manage_pages permite que o aplicativo obtenha os tokens de acesso das páginas que o usuário administra.
Por padrão, o token de acesso de página também é de curta duração. Porém, caso o token de acesso de usuário usado para requisitar o token de acesso de página, seja de longa duração, o token de acesso de página também será de longa duração, que no caso, não tem tempo de expiração, ele é por tempo ilimitado.
Para gerar o token de página é necessário fazer uma requisição em /me/accounts usando um token de acesso de usuário. Veja abaixo o código responsável para gerar o token de acesso da página.
pagina-contas.php:
<?php session_start(); date_default_timezone_set('America/Sao_Paulo'); // autoloader gerado pelo composer require_once __DIR__ . "/vendor/autoload.php"; // instancia do facebook $fb = new Facebook\Facebook([ 'app_id' => '', 'app_secret' => '', 'default_graph_version' => '' ]); // token de acesso do usuario de longa duracao $accessToken = ''; try { $response = $fb->get("/me/accounts", $accessToken); $accounts = $response->getGraphEdge(); echo "<pre>\n"; echo "--------------\n"; foreach($accounts as $account) { echo "ID => " . $account['id'] . "\n"; echo "Name => " . $account['name'] . "\n"; echo "Access Token => " . $account['access_token'] . "\n"; echo "--------------\n"; } echo "</pre>\n"; } catch(Facebook\Exceptions\FacebookResponseException $e) { echo 'Graph returned an error: ' . $e->getMessage(); exit; } catch(Facebook\Exceptions\FacebookSDKException $e) { echo 'Facebook SDK returned an error: ' . $e->getMessage(); exit; }
Lembre-se de parametrizar:
- App ID, App Secret e App Version nas linhas 10, 11 e 12
- Token de acesso de usuário estendido na linha 16 que tenha sido gerado por um aplicativo que tenha no mínimo solicitado a permissão manage_pages.
Ao executar o script pagina-contas.php será exibido na tela todas as páginas que o usuário administra incluíndo seu token de acesso correspondente.
Depurando tokens de acesso
O facebook tem uma ferramenta bem interessante que detalha as informações de um token de acesso. Ela pode ser acessada através do link https://developers.facebook.com/tools/debug/accesstoken/.
Basta informar o token de acesso e clicar no botão “Depurar”.
Conclusão
Neste breve atigo, de forma simples, foi possível demonstrar como gerar access tokens na plataforma do Facebook. Espero que tenha um bom proveito das informações e boa sorte!
Referências
https://developers.facebook.com/docs/facebook-login/access-tokens
Oi Douglas, seguindo outros posts aqui do site criei um app para postar fotos no mural dos usuários. Ja consigo obter o acces tokem extendido (60 dias) e armazenar no BD. Gostaria de saber como faço para conseguir a renovação desses tokens após sua expiração. Você consegue me ajudar?
Olá José,
Será necessário fazer o usuário passar pelo processo de autorização do seu app novamente. Basta requisitar o token novamente e atualizar no banco de dados. Uma coisa que você pode fazer, é sempre atualizar o token (de forma extendida) no db sempre que o usuário acessar o seu aplicativo.
Boa sorte!
Douglas, obrigado por responder.
Construí um app, onde diversos usuários simpatizantes de um grupo de voluntariado autorizam a publicação de fotos em suas timelines. Assim, eu acesso o aplicativo defino a imagem e mensagem a ser divulgada (aprendi com você. rsrsrs) e com um clique o post é publicado no perfil de todos.
Quando o usuário aceita o aplicativo, o userId, a data e o token extendido(60 dias) são salvos no db que monitora o prazo de expiração do mesmo.
A questão é que eu gostaria de construir uma forma personalizada de COMUNICAR o usuário que ele precisa renovar as permissões do aplicativo, seja por mensagem direta ao usuário, mensagem inbox,
De que forma se requisita a renovação do Token? o usuário precisa primeiro exlcuir o app e depois aceita-lo novamente, ou ao final dos 60 dias (token extendio) o app é automaticamente excluído?
Abraço
Olá José,
Via API, não há uma forma de comunicar o usuário por inbox. O que você pode fazer, é avisá-lo por e-mail caso seu app tenha solicitado a permissão para isso. A renovação do Token é feita de forma transparente, ou seja, da mesma maneira que você fez da primeira vez. Basta o usuário passar pelo seu aplicativo novamente. O app não é excluído automaticamente depois dos 60 dias, apenas o token se torna inativo caso o usuário não retornar ao seu app neste intervalo de tempo.
Boa sorte!
Douglas, agora que já tenho meu aplicativo funcionando, gostaria de salvar o primeiro nome, o e-mail, aniversário e a cidade do usuário no banco de dados mas não sei como resgatá-los e armazená-los em uma variável para gravar no bd.
Você consegue me ajudar e me dar um exemplo?
O Access token extendido eu já consigo resgatar assim:
$token_extendido = $facebook->getAccessToken();mas como ele vem codificado, preciso descobrir como compara-lo com a data atual para saber se já está expirando ou não (por enquanto além do token salvo também a data e faço a comparação de 60 dias a partir da data de inclusão do token no bd.) para poder avisar o usuário por email.
Bom dia! Gostaria de saber se a api do facebook tem algum método de exlusão dos posts em PHP, por exemplo fiz um post de uma propaganda, 2h depois quero fazer o mesmo post porém excluindo o anterior!
Boa tarde Fernando,
Sim, é possível excluir o POST via PHP, porém somente se a postagem foi realizada pelo mesmo aplicativo que esta inserindo o post. No momento da postagem via PHP, é retornado um ID único dela. Guarde esse ID em um banco de dados. A qualquer momento você pode excluir usando o SDK para php, através do método DELETE. Doc: https://developers.facebook.com/docs/graph-api/reference/v2.4/post#deleting
Boa sorte!
Douglas, posto em grupos atraves de um software, sendo que, ele tem uma opção de inserir o Token de Access. Qual a importancia do Token?Pois faço as postagens, sem ter inserido o Token, e esta postando normalmente.Obrigado.
Olá Haroldo, acredito que o software usa a sua própria conta do facebook para realizar as publicações. É necessário um token para publicação no grupo, no caso, o software que você usa, consegue obter o token do seu usuário automaticamente para publicar. O software deve dar essa opção para caso queira publicar em nome de outros usuários. O token no caso é a forma que a API do facebook tem para identificar o usuário. Espero ter ajudado. Boa sorte!
Como por esse codigo em um banco de dados
Olá Christian, o importante é salvar em banco de dados apenas os tokens que esses códigos estão gerando! Posteriormente você pode usar o access token para fazer requisições offline. No caso são os valores das variáveis $acess_token e $page_access_token.
entao eu quero criar um site de curtidas tipo igual o auto liker , faceslikes e tal sabe me informar qual açao tenho tenho que permitir
Olá Chrisitan, eu acredito que você pode fazer da seguinte forma: solicitar as permissões publish_actions e publish_pages que são suficientes para dar like em postagens do usuário e de páginas. Porém, para dar um like em uma postagem pública você precisará de um access token de usuário. Para dar 100 likes em um postagem, você terá que ter uma base de access tokens de 100 usuários que aceitaram o seu aplicativo. O mais difícil desse processo é você montar essa base de access tokens.
Boa sorte!
coo que eu solicito essas permissoes ?
entao eu preciso saber como eu gero esse codigo de acesso token pesquisei mais nao encontrei
esse token qe vs ensina e o propio
Fera. Não esta funcionando mais. ” “error”: {
“message”: “Invalid Client ID”,” O Que fazer?
Qual token esta tentando gerar ? usuário, página ou app ? Talvez eu precise atualizar os códigos. Me informe em qual dos tipos de token teve problema. Valeu!
Olá, sou programador .net (VB) e queria realizar postagem de imagem (se possível selecionar o album) em uma pagina específica… tentei pelo Nuget usar o C# SDK ainda teria que converter linguagem. Alguém pode me ajudar como fazer isso?
Ola Silas, no momento o que tenho mais próximo para te ajudar é o artigo Manipulando fotos no facebook com sdk para php. Porém é para PHP. Você tem a alternativa de usar o Windows SDK para Facebook. Neste link tem exemplo de upload de foto. Boa sorte!
Bom dia Douglas eu preciso estender o token de usuário vc pode me ajudar como proceder ?
Mauro, por sorte eu atualizei o artigo explicando mais detalhadamente como gerar os tokens de acesso, inclusive como estendê-los. Espero que ajude! Boa sorte!
Boa tarde, Douglas,
Tenho um aplicativo que utilizar a conexão via token de acesso que não expira, porem ao postar mensagens em grupos no facebook mesmo colocando intervalo de 15 minutos entre as postagens o face bloqueia congelando a postagem até o dia xxx.. Voce sabe me dizer qual o intervalo ideal de postagens automáticas para evitar o bloqueio de postar em grupos pelo face ?
Se quiser testar meu sistema me envie email que combinamos .
William Schmidt http://www.speedpost.com.br
Olá William, o facebook possui um série de impeditivos para aplicativos de publicações automáticas em grupos, eventos, etc. pois vai contra suas diretrizes. Essas proteções vão evoluíndo com o tempo dificultando cada vez mais esses tipos de aplicativos.
De qualquer forma, uma sugestão para evitar menos bloqueios, é usar tokens de acesso de usuários diferentes. Procure usar usuários “reais”, caso contrário você terá problemas com o facebook e ele desativará seus usuários “fake”.
Boa sorte!