Come verificare il token di accesso di Facebook?


108

C'è solo una cosa che il server deve fare; basta controllare la validità di qualsiasi token di accesso.

I client inviano al server l'ID utente e il token di accesso ottenuto da FB.getLoginStatus. Come mi aspettavo, ci sarebbe stato qualsiasi URL che controlla la validità del token di accesso, come http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx.

Ciò restituisce se è disponibile o meno o esiste un'API (lato server) per questo?


2
Perché non chiamare semplicemente graph.facebook.com/me/permissions?
Igy



3
C'è una bella interfaccia utente developer.facebook.com/tools/debug/accesstoken
Clergyman

Risposte:


136

Il metodo ufficialmente supportato per questo è:

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

Per ulteriori informazioni, vedere la documentazione del token di controllo .

Una risposta di esempio è:

{
    "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
    }
}

24
Penso che sia fuorviante dire che è più probabile che Facebook introduca cambiamenti di rottura. Non affermano che da nessuna parte ei loro documenti ufficiali chiariscono che questo è il modo per convalidare il token di accesso
Ed Sykes

1
@rynop, beh, il nome dell'endpoint API è "debug_token" ed è descritto in una sezione della documentazione dell'API di Facebook denominata Ottenere informazioni su token e debug . Questa sezione della documentazione è indicata dall'ancora HTML #debug e afferma che l'API è il back-end per il loro strumento di debug. Mi sembra abbastanza chiaro, ma hai ragione sul fatto che tecnicamente, da nessuna parte è chiaramente e direttamente affermato che la funzione non è intesa per uso di produzione ... :-)
Jonathan Gilbert

5
Il problema principale qui è che l'utilizzo del metodo me? Access_token è semplicemente sbagliato se i dati provengono dal lato client; poiché qualsiasi sito può pescare token, usali per autenticarti nel tuo sito accedendo alla tua API.
srcspider

4
L'OP voleva controllare l'ID utente associato al token. L'endpoint / me restituisce l'ID utente, ma solo se il token di accesso è valido (perché, dopotutto, il token viene utilizzato per determinare quale "me" restituire). Quindi, prendimi e confronta gli ID utente. È necessario tenere presente che ogni app ottiene i propri ID utente con ambito specifico, quindi non è possibile confrontare gli ID da una fonte diversa con il / me che si ottiene con il token della propria app.
Jonathan Gilbert

3
I documenti potrebbero in passato avere riferimenti utilizzando questo per il debug. Ma attualmente suggerisce che questo è esattamente il caso d'uso.
AndHeiberg

78

Puoi semplicemente richiedere https://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx se ricevi un errore, il token non è valido. Se ottieni un oggetto JSON con una proprietà id, allora è valido.

Sfortunatamente questo ti dirà solo se il tuo token è valido, non se proviene dalla tua app.


9
Scusa, la mia domanda non era chiara. Il problema è come verificare l'utente solo con uid e accessToken. graph.facebook.com/100000726976284?access_token=xxxxxx Ad esempio, esiste un modo semplice per verificare se il token di accesso dell'utente 100000726976284 è xxxxxx. Immagino che il file "verificato" sia la chiave. Solo quando ho inserito xxxxxx corretto, ho potuto vedere verificato = vero nella risposta.
So Jae Kyung

14
Richiedi graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx come menzionato sopra, quindi verifica che l'UID che hai corrisponde all'ID restituito dalla richiesta.
AlexQueue

51
Questo non verificherà che access_token sia per la tua app.
Ed Sykes

Inoltre non fornendo expires_atinformazioni.
Vinesh

4
downvoting, d'accordo con @EdSykes, in questo modo non puoi controllare se il token di accesso appartiene agli sviluppatori della
app.facebook.com/docs/facebook-login/security

35

Volevo solo farti sapere che fino ad oggi stavo prima ottenendo un token di accesso all'app (tramite richiesta GET a Facebook), e quindi utilizzando il token ricevuto come app-token-or-admin-tokenin:

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

Tuttavia, ho appena realizzato un modo migliore per farlo (con l'ulteriore vantaggio di richiedere una richiesta GET in meno):

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

Come descritto nella documentazione di Facebook per i token di accesso qui .


6
Grazie. Nota per altri: il letterale "|" carattere deve essere incluso (che non indica "o") come mostrato nella pagina collegata alla risposta: developers.facebook.com/docs/facebook-login/…
Mike S

1
Non è sicuro? L'invio del segreto dell'app tramite i parametri di query dell'URL lo espone a chiunque "nel mezzo" tra il tuo server e Facebook e HTTPS non aiuta, poiché gli URL non sono crittografati. Chiunque potrebbe semplicemente "ascoltare" (annusare) richieste con URL in formato debug_token e rubare i segreti delle app di Facebook.
Simeon


@Xeing grazie, vedo che avevo un'impressione sbagliata :) Sembra che solo la parte host dell'URL non sia crittografata.
Simeon

1
Aggiungendo il "|" con il segreto dell'app mi ha fatto andare finalmente. Altrimenti questa API non funziona.
Uday

4

Richiedi semplicemente (HTTP GET):

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

Questo è tutto.



1

Exchange Access Tokenper Mobile Number and Country Code(lato server O lato client)

Puoi ottenere il mobile numbercon il tuo access_tokencon questo API https://graph.accountkit.com/v1.1/me/?access_token=xxxxxxxxxxxx . Forse, una volta che hai il mobile numbere id, puoi lavorare con esso per verificare l'utente con il tuo server & database.

xxxxxxxxxx sopra è il Access Token

Risposta di esempio:

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


Scambia Auth Codeper Access Token(lato server)

Se invece ne hai uno Auth Code, puoi prima ottenerlo Access Tokencon questo API: https://graph.accountkit.com/v1.1/access_token?grant_type=authorization_code&code=xxxxxxxxxx&access_token=AA|yyyyyyyyyy|zzzzzzzzzz

xxxxxxxxxx, yyyyyyyyyye zzzzzzzzzzsopra sono rispettivamente Auth Code, App IDe App Secret.

Risposta di esempio

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

Nota - Questo è preferito sul server-sidedato che la APIrichiede il APP Secretche non è destinata ad essere sharedper security reasons.

In bocca al lupo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.