Como verificar o token de acesso do Facebook?

108

Só há uma coisa que o servidor precisa fazer; apenas verifique a validade de qualquer token de acesso.

Os clientes enviam ao servidor o id de usuário e o token de acesso obtido por FB.getLoginStatus. Como eu esperava, haveria qualquer URL que verifique a validade do token de acesso, como http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx.

Isso retorna se está disponível ou não ou há alguma API (lado do servidor) para isso?

Então Jae Kyung
fonte
2
Por que não ligar apenas para graph.facebook.com/me/permissions?
Igy
Consulte também stackoverflow.com/questions/8141037/…
Vadzim
2
possível duplicação da validação do servidor de token de acesso
Flimzy,

Respostas:

136

O método oficialmente suportado para isso é:

GET graph.facebook.com/debug_token?
     input_token={token-to-inspect}
     &access_token={app-token-or-admin-token}

Consulte a documentação do token de verificação para obter mais informações.

Um exemplo de resposta é:

{
    "data": {
        "app_id": 138483919580948, 
        "application": "Social Cafe", 
        "expires_at": 1352419328, 
        "is_valid": true, 
        "issued_at": 1347235328, 
        "metadata": {
            "sso": "iphone-safari"
        }, 
        "scopes": [
            "email", 
            "publish_actions"
        ], 
        "user_id": 1207059
    }
}
rynop
fonte
24
Acho que é enganoso dizer que é mais provável que o Facebook introduza mudanças importantes. Eles não declaram isso em nenhum lugar e seus documentos oficiais deixam claro que esta é a maneira de validar o token de acesso
Ed Sykes
1
@rynop, bem, o nome do endpoint da API é "debug_token" e é descrito em uma seção da documentação da API do Facebook chamada Obtendo informações sobre tokens e depuração . Esta seção da documentação é referenciada pela âncora HTML #debug e afirma que a API é o back-end para sua ferramenta de depuração. Parece muito claro para mim, mas você está certo que, tecnicamente, em nenhum lugar está claro e diretamente declarado que a função não se destina ao uso em produção ... :-)
Jonathan Gilbert
5
O principal problema aqui é que usar o método me? Access_token é simplesmente errado se os dados vêm do lado do cliente; já que qualquer site pode pescar tokens, use-os para se autenticar em seu site acessando sua API.
srcspider
4
O OP queria verificar o ID do usuário associado ao token. O ponto de extremidade / me retorna o ID do usuário, mas apenas se o token de acesso for válido (porque, afinal, o token é usado para determinar qual "eu" retornar). Então, pegue / me e compare os IDs de usuário. Deve-se ter em mente que cada aplicativo obtém seus próprios IDs de usuário com escopo especial, portanto, você não pode comparar IDs de uma fonte diferente com o / me que você obtém com o token de seu próprio aplicativo.
Jonathan Gilbert
3
No passado, os documentos podem ter referências usando isso para depuração. Mas atualmente sugere que este é exatamente o caso de uso.
AndHeiberg
78

Você pode simplesmente solicitar https://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx se receber um erro, o token é inválido. Se você obtiver um objeto JSON com uma propriedade id, ele é válido.

Infelizmente, isso só dirá se seu token é válido, não se veio de seu aplicativo.

Andy Muth
fonte
9
Desculpe, minha pergunta não foi clara. O problema é como verificar o usuário apenas com uid e accessToken. graph.facebook.com/100000726976284?access_token=xxxxxx Por exemplo, existe alguma maneira simples de verificar se o token de acesso do usuário 100000726976284 é xxxxxx. Acho que o campo 'verificado' é a chave. Somente quando coloquei xxxxxx correto, pude ver verificada = verdadeira na resposta.
Então Jae Kyung
14
Solicite graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx como mencionado acima e, em seguida, verifique se o uid que você possui corresponde ao id devolvido na solicitação.
AlexQueue
51
Isso não verificará se o access_token é para seu aplicativo.
Ed Sykes
Também não fornece expires_atinformações.
vinesh
4
downvoting, concordo com @EdSykes, desta forma você não pode verificar se o token de acesso pertence ao seu aplicativo developers.facebook.com/docs/facebook-login/security
nikis
35

Só queria que você soubesse que até hoje eu estava primeiro obtendo um token de acesso de aplicativo (via solicitação GET para o Facebook) e, em seguida, usando o token recebido como app-token-or-admin-tokenem:

GET graph.facebook.com/debug_token?
    input_token={token-to-inspect}
    &access_token={app-token-or-admin-token}

No entanto, acabei de descobrir uma maneira melhor de fazer isso (com o benefício adicional de exigir uma solicitação GET a menos):

GET graph.facebook.com/debug_token?
    input_token={token-to-inspect}
    &access_token={app_id}|{app_secret}

Conforme descrito na documentação do Facebook para tokens de acesso aqui .

Andy
fonte
6
Obrigado. Nota para outros: o literal "|" caractere deve ser incluído (que não indica 'ou') conforme mostrado na página vinculada na resposta: developers.facebook.com/docs/facebook-login/…
Mike S
1
Isso não é inseguro? Enviar o segredo do aplicativo por meio de parâmetros de consulta de URL o expõe a qualquer pessoa "no meio" entre o seu servidor e o Facebook e o HTTPS não ajuda, pois os URLs não são criptografados. Qualquer um poderia apenas "ouvir" (farejar) solicitações com URLs no formato debug_token e roubar segredos de aplicativos do Facebook.
Simeon
@Xehegando obrigado, vejo que tive a impressão errada :) Parece que apenas a parte do host da URL não está criptografada.
Simeon
1
Adicionando o '|' com o aplicativo secreto, finalmente consegui. Caso contrário, esta API não funciona.
Uday
4

Basta solicitar (HTTP GET):

https://graph.facebook.com/USER_ID/access_token=xxxxxxxxxxxxxxxxx

É isso aí.

Nadav B
fonte
1

Troca Access Tokenpor Mobile Number and Country Code(lado do servidor OU lado do cliente)

Você pode obter o mobile numbercom o seu access_tokencom este API https://graph.accountkit.com/v1.1/me/?access_token=xxxxxxxxxxxx . Talvez, depois de ter o mobile numbere o id, você possa trabalhar com ele para verificar o usuário com o seu server & database.

xxxxxxxxxx acima está o Access Token

Resposta de exemplo:

{
   "id": "61940819992708",
   "phone": {
      "number": "+91XX82923912",
      "country_prefix": "91",
      "national_number": "XX82923912"
   }
}


Troca Auth Codepor Access Token(lado do servidor)

Se você tiver um Auth Code, você pode primeiro obter o Access Tokencom este API- https://graph.accountkit.com/v1.1/access_token?grant_type=authorization_code&code=xxxxxxxxxx&access_token=AA|yyyyyyyyyy|zzzzzzzzzz

xxxxxxxxxx, yyyyyyyyyye zzzzzzzzzzacima são Auth Code, App IDe App Secretrespectivamente.

Resposta de exemplo

{
   "id": "619XX819992708",
   "access_token": "EMAWdcsi711meGS2qQpNk4XBTwUBIDtqYAKoZBbBZAEZCZAXyWVbqvKUyKgDZBniZBFwKVyoVGHXnquCcikBqc9ROF2qAxLRrqBYAvXknwND3dhHU0iLZCRwBNHNlyQZD",
   "token_refresh_interval_sec": XX92000
}

Nota - Este é o preferido na server-sidedesde o APIexige o APP Secretque não é feito para ser sharedpara security reasons.

Boa sorte.

Akash
fonte