Facebook App: Requisitando permissões pela API do PHP
Introdução
Neste artigo vamos aprender como solicitar permissões para o usuário através de Aplicativo para Facebook. Os exemplos deste artigo são baseados na versão 4.0.x 5 do SDK para PHP. Caso esteja iniciando e gostaria de saber como criar aplicativos para facebook, sugiro ler primeiro meu outro artigo Criando Aplicativos Facebook SDK v5 em PHP
Solicitar permissões é um processo necessário quando se precisa de alguma informação adicional que não esta presente no perfil público do usuário ou quando necessário realizar operações em nome do usuário, entre outros.
Exemplo de algumas permissões possíveis:
Permissão | Descrição |
---|---|
Permite acesso ao endereço de e-mail primário do usuário. | |
publish_actions | Concede acesso a publicar posts entre outras ações em nome do usuário. |
manage_pages | Permite o aplicativo obter tokens de Páginas que o usuário administra. |
publish_pages | Concede permissão para publicar, gerar comentários e likes em páginas que o usuário administra. |
user_birthday | Permite acessar o dia e mês de aniversário do usuário. |
user_likes | Permite acesso a lista de todas páginas e objetos que o usuário curtiu. |
Um referência completa de permissões do facebook pode ser obtida no link https://developers.facebook.com/docs/facebook-login/permissions/v2.4#reference
Solicitando Permissões
Solicitar permissões na Plataforma do Facebook é possível através do componente de Login. Basta informarmos quais permissões desejamos solicitar através de um array informado como segundo parâmetro para o componente de Login. Veja exemplo abaixo onde solicitamos a permissão email e a user_birthday.
$helper = $fb->getRedirectLoginHelper(); // array com as permissoes a serem solicitadas $perms = [ 'email', 'user_birthday' ]; // url que o usuario sera redirecionado pelo facebook apos // efetuado o login e perms. $redirect_url = 'http://www.example.com'; $loginUrl = $helper->getLoginUrl($redirect_url, $perms); echo '<a href="'.$loginUrl.'">Login with Facebook</a>';
Veja que na tela de ingressão no aplicativo, além do perfil público o aplicativo solicita permissão para acessar o e-mail e a data de aniversário do usuário:
Você pode solicitar permissões a qualquer momento em seu aplicativo, não necessariamente no momento inicial que o usuário acessa o aplicativo. Por exemplo, você pode querer solicitar a publish_actions somente quando for necessário publicar algo no mural do usuário por exemplo.
Permissões Extendidas
Permissões extendidas dão acesso a informações mais sensíveis do usuário para o aplicativo, como por exemplo, publicar e deletar dados. Todas permissões extendidas aparecem um uma janela separada, onde o usuário pode decidir se quer aceitá-la ou não.
Exemplos de algumas permissões extendidas: publish_actions, publish_pages, manage_pages, read_mailbox. Mais informações sobre permissões extendidas podem ser obtidas em https://developers.facebook.com/docs/facebook-login/permissions/v2.4#reference-extended.
Veja abaixo, quando solicitamos uma permissão extendidas, no caso a publish_actions, ela parece em uma janela a parte, com a opção de pular:
Checando Permissões
A plataforma do facebook permite verificar as permissões que o usuário concedeu para o aplicativo. Por exemplo, é interessante verificar se o usuário possui a permissão publish_actions antes de realizar publicações em seu mural. Lembrando que o usuário pode revogar a permissão ou não aceitá-la. Veja abaixo como podemos obter a lista completa de permissões que o usuário concedeu para o aplicativo. Também colocamos uma verificação referente a permissão publish_actions:
// requisita lista de permissoes para o graph api $response = $fb->get('/me/permissions', $accessToken); // trata a resposta em um formato util $permissions = $response->getDecodedBody(); $permissions_list = []; foreach($permissions['data'] as $perm) { if($perm['status'] == 'granted') { $permissions_list[] = $perm['permission']; } } if(in_array('publish_actions', $permissions_list)) { // usuario tem publish_actions, continuar o app } else { // redirecionar o usuario para aceitar a permissao $helper = $fb->getRedirectLoginHelper(); // url que o usuario sera redirecionado pelo facebook apos // efetuado o login e perms. $redirect_url = 'http://www.example.com'; $loginUrl = $helper->getLoginUrl($redirect_url, [ 'publish_actions' ]); // redireciona header("Location: $loginUrl"); exit; }
Obs: Perceba que é necessário checar a propriedade status == ‘granted’ que realmente garante que a permissão foi concedida.
Submetendo o aplicativo para revisão
É importante destacar que já algum tempo o facebook solicita que você envie o aplicativo para revisão antes que possa publicá-lo em produção onde outros usuários poderão utilizá-lo. É necessário enviar uma série de informações, entre elas o motivo que esta usando cada uma das permissões. As únicas permissões que não precisam de revisão são as permissões consideradas básicas: public_profile, user_friends, email. Para te ajudar nesse processo de revisão, aconselho a usar o link https://developers.facebook.com/docs/apps/review como ponto de partida. Você encontrará várias informações úteis que irão lhe auxiliar no processo.
legal
Gostei, poderia dizer como faz para publicar no mural do usuário agora rsrsrs.
Olá Lucas, veja se o post abaixo te ajuda:
http://dpasqua.wordpress.com/2012/06/28/manipulando-fotos-no-facebook-com-sdk-para-php/
Abraços
Ótimo blog, já estou acompanhando. Podia mostrar como acessar as fotos dos amigos?
Abraços.
Uma maneira simples de obter fotos de amigos:
http://graph.facebook.com/id-do-amigo/picture
Para obter a lista de amigos no sdk para php:
$friends = $facebook->api(‘/me/friends’);
Muito bom, como faço agora para publicar uma imagem no perfil do usuario?
Olá Roni,
O post abaixo explica como postar fotos na linha do tempo do usuário:
http://dpasqua.wordpress.com/2012/06/28/manipulando-fotos-no-facebook-com-sdk-para-php/
Boa sorte.
Opa, bom post amigo. Isso funciona na plataforma do Blogger?
Olá William,
O Blogger tem integração com o facebook. Acredito que você pode configurá-lo para postar automaticamente no facebook assim que publicar um novo artigo.
Sim, o Blogger irá solicitar as permissões necessárias para que ele possa publicar no seu mural do facebook.
Verifica o artigo abaixo:
http://www.wikihow.com/Integrate-Your-Blogger-Post-With-Facebook,-Twitter,-and-SMS-with-Twitterfeed
Boa sorte!
Obrigado pela atenção. Na verdade o que estou querendo fazer é criar um app que publique no próprio mural do usuário (quando ele permitir). Ao entrar no site a pessoa seria redirecionada para o link em que o app pede a permissão, após isso o próprio app direciona de volta o usuário ao site e publica determinada mensagem em seu mural. O problema é que isso ultrapassa bonito meus conhecimentos hahaha, abrçs.
Legal William,
Você pode encontrar mais dicas referente a sua necessidade nos seguintes artigos:
Facebook php sdk, postando mensagens no mural do usuário
Manipulando fotos no facebook com sdk para php
Boa sorte!
Como faço para deslogar o usuário depois?
Olá Alex,
Você pode solicitar a URL de logout do facebook por API. Mais detalhes em:
http://developers.facebook.com/docs/reference/php/facebook-getLogoutUrl/
Boa sorte!
É estranho, pois desconecta do facebook, porém na minha página permanece logado.
Olá, Pasquati. Blog sensacional.
Cara, não estou conseguindo capturar os livros do profile do usuário. No graph api ele cita que a permissão publish_action é suficiente, mas não consigo. Queria imprimir na pag do app apenas o nome e os livros do usuário.
Valeu
Olá Inaldo,
Para obter a lista de livros, tente fazer o seguinte:
Boa sorte!
valeu demais, pasquati. no entanto, não teria como, através da api do facebook, ter uma resposta similar como se estivesse capturando apenas o nome do sujeito?
por exemplo, se eu tentar:
será mostrado no meu browser apenas o nome do usuário. minha pergunta é: não haveria nada similar com os books do perfil do user?
eu tentei isso:
ele só responder a palavra “Array”.
valeu demais.
Olá Inaldo,
Tente seguir o exemplo abaixo:
Fazer a requisição no books.reads não me trouxe resultado nenhum. Talvez ainda não esteja habilitado em usuário no brasil. É só uma suposição minha. Entretanto, o exemplo acima esta funcionando.
Boa sorte!
Olá Douglas
Muito bom este post, uma dúvida. Não estou conseguindo requisitar as permissões uma única vez, o usuário deve aceitar uma por uma. Você consegue me ajudar? Abraços e obrigado
‘XXXXX’,
‘secret’ => ‘XXXXXXX’,
));
// obtem o id do usuario
$user = $facebook->getUser();
if ($user) {
// Obtem dados do usuario logado
$user_profile = $facebook->api(‘/me’);
// Verificando se possui permissao
$permissions = $facebook->api(“/me/permissions”);
if(! (array_key_exists(‘publish_stream’, $permissions[‘data’][0])
&& array_key_exists(‘user_about_me’, $permissions[‘data’][0])
&& array_key_exists(’email’, $permissions[‘data’][0])
)) {
/* solicitar as permissões */
header(“Location: ” . $facebook->getLoginUrl(array(“scope” => “publish_stream,user_about_me,email”)));
exit;
}
//Publicando no Mural
$facebook->api(“/me/feed”, “post”, array(
‘message’ => utf8_encode(“Promoções na loja virtual Polo USA, até 70% de desconto, Acesse.”),
‘name’ => “Loja Virtual Polo USA”,
‘link’ => “http://lojavirtual.polousa.com.br”,
‘picture’ => “http://polousa.com.br/facebook/facelogo2.jpg”,
));
} else {
// usuario nao logado, solicitar autenticacao
$loginUrl = $facebook->getLoginUrl();
echo “Facebook Login“;
echo “Você não esta conectado no Facebook“;
}
Olá Felipe,
Para te ajudar nesse processo, modifique o final no final do seu script, de:
para:
Boa sorte!
Muito Obrigado Douglas.
Amigo, i need you help!
Como eu faço para pegar o Id do usuário? Fiz uma pagina utilizando o graph explorer do facebook, para quando o usuário logar no meu site, eu tenho uma pagina PERFIL, que pega as informações do graph explorer. Porém eu não sei como pegar o id do usuário para por no graph pra cada usuario que logar. Por Favor Help, é pro meu tcc!!! Grande Abraço
Olá Mauricio,
Pegar o ID do usuário do facebook pela api é bem simples. Exemplo:
Neste artigo, verifica a linha 14 da primeira listagem de código.
Boa sorte!
Fiz um botão para clicar para logar, mas estranhamente tenho que clicar duas vezes para logar…. Isso já lhe aconteceu?
Olá Gustavo!
Não me recordo de isso ter acontecido. Só uma dúvida, você esta se referindo à solicitação de permissões? Normalmente, o facebook solicita mais de uma janela de confirmação de permissão, de acordo com a permissão solicitada. Algumas solicitações de permissão são agrupadas em uma única janela, outras solicitações mais primordiais são solicitadas em janelas independentes.
Boa sorte!
Olá cara, parabéns pelo Blog. Ótimos posts.
Estou tentando recuperar informações como Bairro, CEP e o Telefone Celular e não estou conseguindo.
Sabe me dizer quais seriam as permissões que deveria solicitar?
Obrigado!
Olá Cleiton,
De acordo com o Facebook, as permissões para solicitar endereço e número de celular foram removidas da API por motivos de segurança. Mais detalhes em:
https://developers.facebook.com/blog/post/2011/01/14/platform-updates–new-user-object-fields–edge-remove-event-and-more/
Boa sorte!
Obrigado cara, já imaginava que não seria possível por questões de segurança mesmo. Mas precisava de algo para comprovar pro cliente.
Valeu mesmo!
Muito bom me ajudou bastante! Só precisava de uma ajuda. Eu usei esta API, porém o meu APP é aqueles que ficam na fachada de uma Página, ou seja um app dentro do Facebook. Teria como eu solicitar a pemissão dentro do próprio escopo do app do facebook? Porque com o redirecionamento Header, o face nao aceita, fica em branco, porém acessando o url direto, ai redireciona certinho.
Pode me ajudar?
Olá Caio, que bom que gostou das dicas.
O artigo abaixo irá lhe ajudar exatamente nessa questão que levantou:
http://www.douglaspasqua.com/2012/08/30/facebook-app-trabalhando-com-login-atraves-do-sdk-para-javascript/
Quando você trabalha com o app dentro do facebook, as permissões devem ser solicitadas pelo sdk de javascript, que tem um comportamento especial quando chamado dentro de uma aba.
Boa sorte!
Douglas, aconteceu uma coisa estranha. Até pouco tempo eu criava o app, integrava e solicitava as permissões numa boa. Hoje em dia quando faço o mesmo processo acima ele gera um erro de loop de redirecionamento. Por exemplo, se eu apenas faço a autenticação simples sem solicitar permissão não tem problema, mas se solicito esta permissão, é gerada esta mensagem. Sabe o que pode ser ? Abs,
olá eu gostaria de saber como eu consigo a permissão para o facebook me liberar a ação de publicar coisas no perfil do usuário, porque quando eu mando a requisição pro facebook ele diz que eu não tenho a permissão para publicar, e eu só pego as informações do usuário.
Olá Mikael,
Infelizmente este artigo esta um pouco desatualizado em relação à atual API do facebook. A permissão correta para publicação no perfil do usuário é publish_actions e não mais publish_stream. Também houveram mudanças no modo de verificar se o usuário aceitou determinada permissão. Segue um link com um código mais atual de como fazer para solicitar e checar permissões: https://gist.github.com/dpasqua/773f15268ffd68fd8510.
Boa sorte!
Olá amigo. excelente tutorial. Mas tenho algumas dúvidas. Após o usuário aceitar me aplicativo eu tenho acesso sempre as informações dele ou é só quando ele aceita?
Olá Rodolfo, você pode ter acesso as informações do usuário enquanto ele estiver com o seu app autorizado na conta dele. É possível requisitar informações através de access token, isso permite acessar as informações dele a qualquer momento. Você precisa gravar o ID do facebook junto com o token de acesso dele em um banco de dados próprio.
Um pouco mais sobre access token, pode ser acessado através do artigo: Facebook API, Gerando tokens de acesso
Boa sorte!
Obrigado pela resposta Douglas. Só mais uma coisa. inicialmente eu tenho 3 permissões: email, public_profile e user_friends. Eu preciso separar cada informação e colocar em uma coluna da tabela. Já fiz com nome, email e foto (peguei de seus tutoriais). Como faço para separar as demais informações?
Olá Rodolfo,
Para pegar as informações básicas você deve ter feito uma requisição em /me. Para obter a lista de amigos, faça uma requisição em /me/taggable_friends.
Boa sorte!
Boas Douglas!
Lí e gostei do que ví, parabéns, você manja do assunto rsrs…
E por isso tenho uma dúvida.
Eu tenho um APP que grava (preciso que grave) as duas Ids, uma appId e o Id do user do face.
O appId, é o userscopeID diferente para cada app criado. Já o Id do usuário é a referencia do facebook para o usuário.
Então, o getUser() retorna o userScopeID e não o ID do facebook…
A dúvida é justamente essa como pegar o ID do usuário do Facebook e não o scopeId…
Agradeço a ajuda. Meu app de certa forma depende desse ID também =(
Boa tarde! Obrigado pelo feedback e que tenha gostado. Sobre a dúvida, o appId deve ser parametrizado dentro do SDK do facebook, você obtêm o appId no painel de configuração do aplicativo dentro do site do facebook. O getUser() como você disse corresponde ao ID único do usuário. Para esclarecer um pouco melhor, sugiro ler o artigo Criando Aplicativos Facebook SDK v5 em PHP ou Criando aplicativos para Facebook usando SDK do PHP dependendo a versão do SDK que esteja usando.
Boa sorte!
Olá novamente Douglas, obrigado pela resposta. Acredito que eu tenha me expressado mal em alguns momentos, vamos lá:
O ID do meu facebook é esse: facebook.com/100001040056651
O ID da minha app, está dentro do app fornecido na hora que criamos o app.
O ID que a minha app retorna quando eu dou um getUser() é o: facebook.com/935021993209127 (sendo esse o ScopeID)
Sem os urls, claro.
O lance é: como pegar o primeiro ID do meu facebook que eu lhe passei?
Os dois IDs levam para o mesmo canto, porém eu preciso desse ID primário.
Antes do Facebook mudar as regras (1 mês atrás) funcionava.
Mas tem uma app funcionando e retornando o meu ID normalmente… ai eu fiquei intrigado: https://lookup-id.com/
Grato pela ajuda!
Olá Novamente! Realmente entendi sua questão agora. Pelo que andei pesquisando a partir da versão 2.0 da Graph API não é possível mais obter o ID original do usuário do facebook. Quando solicitar o ID, como você fez, sempre será retornado o ScopeID, que é um ID único baseado no usuário e no aplicativo. Porém, ainda é possível achar o ID original do usuário quando você navega pelo site do facebook (não necessariamente usando um app). Entre em algum album de qualquer usuário e visualize uma foto. O ID do usuário estará na barra de endereços do navegador. (junto com outros ids). Portanto seria uma forma alternativa de obter o ID. Veja que esse site, https://lookup-id.com/, não usa nenhum aplicativo para descobrir o ID, ele deve internamente fazer alguma navegação via crawler no site do facebook.
Espero ter colaborado com sua dúvida. Boa sorte!
Erro:
Warning: Unexpected character in input: ‘\’ (ASCII=92) state=1 in /home/storage/8/c7/35/irationline/public_html/facebookapi/postanoface.php on line 15
Parse error: syntax error, unexpected T_STRING in /home/storage/8/c7/35/irationline/public_html/facebookapi/postanoface.php on line 15
Olá Aluizio, pelo erro reportado você deve estar usando uma versão de php mais antiga. Verifique qual é a versão do PHP no seu ambiente de desenvolvimento. A nova versão do SDK do facebook requer a versão 5.4 no mínimo.
Boa sorte!
– Tô usando em um projeto no virtual basic, mais não sei como adiciono ele, poderia gravar um video ensinando?
Olá Jadson,
Não tenho contato com visual basic. O conceito da API do facebook é o mesmo, porém a implementação no visual basic é diferente do artigo. No artigo estou usando PHP. Acredito que no link http://facebooksdk.net/ encontrará mais informações.
Boa sorte!
Como faço para pegar o endereço do usuário?
Olá Kim, pesquisando e consultando a documentação, o facebook não permite obter endereço e telefone do usuário via API devido à questões de segurança.
Parabéns, o melhor artigo do gênero que encontro na web.
Como fazer para imprimir os dados das permissões que solicitou?
Olá Leandro, Obrigado pelo feedback!
Supondo que você tenha solicitado as permissões: ’email’ e ‘user_birthday’. Você poderia recuperar da seguinte forma:
Existem outros tipos de permissões que podem ser recuperadas de outras maneiras, como lista de páginas que o usuário fez like, lista de grupos que o usuário administra, lista de páginas que o usuário administra, etc.
Sugiro ler outros artigos sobre facebook no blog para ir se familiarizando!
Boa sorte!
como faço pra saber quantidade de amigos?
Olá Carlos, Você vai precisar solicitar a permissão user_friends. Para obter a quantidade de amigos, faça a requisição:
Boa sorte!
LEGAL…
Olá Douglas, estava lendo agora seu artigo e tenho uma dúvida. Sempre será necessário submeter o APP para revisão para obter permissões de publicação, por exemplo? Ou há situações que não são necessárias?
Digo pois estou querendo utilizar a API do Facebook para criar um robô que interage pelo usuário. E algumas informações uso em meu sistema particular (de acesso restrito). Neste caso não tem “o que” eu submeter. Não existe aplicativo físico, ou visual. Entende?
Existe alguma forma de não ser obrigatória a submissão?
Vi que você enviou o link do Facebook com detalhes mas tenho uma dificuldade por ele estar em inglês
Olá Ricardo, caso você for usar o aplicativo somente para o seu usuário, para tarefas administrativas próprias, não há necessidade de submeter o aplicativo para revisão ! Pode usá-lo a vontade. Se você for disponibilizar o seu aplicativo para o público, outros usuários, você deve submeter para revisão apenas se estiver usando outras permissões além das: email, public_profile e user_friends. (essas permissões são livres).
Boa sorte!
Douglas, muito bom.
Você sabe me dizer como eu poderia “chamar” o app Facebook instalado no smartphone do usuário para que eu possa pedir permissões diretamente, sem que o usuário tenha que preencher o login no navegador do smartphone?
Olá Raphael, ou você constrói um aplicativo mobile nativo usando os SDKs do facebook para IOS e Android. Outra opção, é você usar Ionic para desenvolver aplicativos mobile. Veja esse tutorial: How to add Facebook Native login to your Ionic app. Boa sorte!
Olá Douglas,
Parabéns pela matéria. Tenho um problema que espero me possa ajudar;
Criei uma aplicação no Face que habilita por defeito as seguintes permissões : email, Public_profile e user_friends.
O problema é que eu gostaria de obter permissões para aceder aos Posts publicados (seja por mim como por outras pessoas), comentários, etc, para aceder a estes dados a partir de uma outra aplicação feita por mim. Você pode ajudar-me?
Jorge Vicente
Olá Jorge, você deve solicitar a permissão user_posts e fazendo uma requisição em /me/feed você conseguirá ler as postagens que estão na timeline do usuário. Junto com cada postagem, você tem o campo ‘id’. Através do id você consegue consultar os comentários feitos em determinada postagem fazendo uma requisição em /ID_DO_POST/comments
Espero ter ajudado. Boa sorte!
Caro Douglas!
Enviei um e-mail para você.
Agradeço sua gentileza.
Olá, Douglas!
Achei este post interessante, mas não consegui entender de onde vem a variável $accesToken, quem alimenta ou o que tem nessa variável?
Abraço.
Olá Ricardo, o $accessToken é gerado pelo componente de Login do Facebook. Sugiro ler o artigo Criando Aplicativos Facebook SDK v5 em PHP que deverá esclarecer suas dúvidas. Boa sorte!
Obrigado Douglas. Fui lá ver o artigo, deu tudo certo agora. Abração!!
Olá, precisava que ao compartilhar um link a página que o facebook retorna apos o compartilhamento viesse com o id_post , tem como?
Olá! Sim, quando você faz uma publicação no facebook via api, você consegue extrair o id da publicação no retorno da requisição. Ex:
Boa tarde, estou tentando publicar post com local, como o checkin, mesmo em desenvolvimento e teste é necessario enviar para analise os requerimentos solicitados pelo facebook para teste?
Boa tarde Jessica, em desenvolvimento não há necessidade de enviar para análise!
Obrigada, consegui!