Convalida lato server del token di accesso Facebook per l'app per iPhone


112

Sto sviluppando un'applicazione per iPhone, che si basa sulla comunicazione con il server, e voglio utilizzare i meccanismi di autenticazione di Facebook.

Fondamentalmente, penso che dovrebbe funzionare in questo modo:

  1. Nella mia app per iPhone, l'utente accede a Facebook, utilizzando la sua email e password.
  2. L'utente consente l'accesso ai propri dati per la relativa applicazione Facebook.
  3. La mia app per iPhone riceve il token di accesso, dopo aver effettuato correttamente l'accesso.
  4. Nell'ulteriore comunicazione con il mio server, la mia applicazione iPhone dovrebbe utilizzare il token di accesso Facebook ricevuto (ad esempio: nelle query).
  5. Quando il mio server riceve una query dall'app per iPhone, con token di accesso, dovrebbe chiedere a Facebook che questo token è valido (e per chi) e, in caso affermativo, il server dovrebbe presumere che l'utente sia autenticato con Facebook.

La mia domanda è: come il server dovrebbe chiedere a Facebook se il token di accesso fornito è valido? Penso che dovrei in qualche modo verificare se il token è valido per la mia app Facebook.

Ho provato molte query di Facebook per rappresentare graficamente l'API, che ho trovato, ma niente ha funzionato come mi aspettavo. Mi puoi fornire qualche esempio?


5
A meno che l'utente non si sia disconnesso dall'app in FB, puoi semplicemente inviare il token di autenticazione al server (ssl si spera). Una semplice query di "/ me" tramite l'API del grafico riesce o fallisce?
The Mad Gamer

riceverai un messaggio in risposta da Facebook che il tuo token non è valido :)
Jean-Luc Godard

1
Sto cercando di fare qualcosa di molto simile a quello che stai facendo. Non hai mai contrassegnato questa domanda come risposta, l'hai mai fatto funzionare?
tempy

Cosa succede quando scade access_token? dovremmo chiedere all'utente di accedere di nuovo? Voglio capire come convalidare nuovamente dopo che il token è scaduto
debianmaster

@debianmaster dipende dall'architettura della tua app. Se consideri il caso "nessun token FB - nessun accesso all'app", allora sì, disconnetti l'utente. Altrimenti, potresti considerare una logica di "scollegamento", in cui l'utente rimane connesso, ma le informazioni ricevute da Facebook vengono scollegate dal suo account sul server / client.
Yevhen Dubinin

Risposte:


115

Ecco una procedura in due passaggi che puoi utilizzare per convalidare l'appartenenza di un token di accesso utente alla tua app:

1) Genera un token di accesso all'app

( https://developers.facebook.com/docs/howtos/login/login-as-app/ )

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID
&client_secret=YOUR_APP_SECRET
&grant_type=client_credentials

2) Eseguire il debug del token di accesso utente

( https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/ )

https://graph.facebook.com/debug_token?
input_token=INPUT_TOKEN
&access_token=ACCESS_TOKEN

Dove INPUT_TOKEN è il token di accesso utente che desideri verificare e ACCESS_TOKEN è il token della tua app che hai ottenuto dal passaggio 1.

L'endpoint di debug fondamentalmente scarica tutte le informazioni su un token, quindi risponderà con qualcosa del genere:

{
    data: {
        app_id: YOUR_APP_ID,
        is_valid: true,
        metadata: {
            sso: "iphone-safari"
        },
        application: YOUR_APP_NAMESPACE,
        user_id: USER_ID,
        issued_at: 1366236791,
        expires_at: 1371420791,
        scopes: [ ]
    }
}

Se il token non proviene dalla "tua app", restituirà una risposta di errore.


13
Secondo Facebook , questo è il modo corretto per ispezionare i token. Tuttavia, la prima parte è facoltativa poiché puoi utilizzare l'ID e il segreto dell'app invece di un amministratore o token dell'app.
Brandon Zacharie

@BrandonZacharie Non vedo come fai, ho appena provato con ID app e segreto e mi ha dato un errore per "parametro input_token richiesto"
Johnny Z

@JohnnyZ il token di input è richiesto. Il token di accesso è dove si trova la flessibilità.
Brandon Zacharie

8
@BrandonZacharie Hai ragione, ricevevo input e token di accesso confusi. Per utilizzare l'ID e il segreto dell'app l'ho passato come parametro con pipe come delimitatore: & access_token = APP_ID | APP_SECRET
Johnny Z


115

Aggiornamento: questa risposta sembra insicura poiché non convalida prima il token come appartenente alla tua app, vedi i commenti, risposta originale come segue:

Presumo che tu abbia già il token di accesso in mano. In tal caso, il modo più semplice per convalidare un token di accesso è emettere la seguente richiesta

https://graph.facebook.com/me?fields=id&access_token=@accesstoken

Qui sostituisci @accesstoken con il token di accesso che hai. Analizzerò l'URL e spiegherò ciascuno.

Stiamo emettendo una richiesta API del grafico che restituirà l'ID utente Facebook del proprietario del token di accesso come stringa JSON. La parola chiave "me" rappresenta l'utente attualmente connesso o il proprietario del token di accesso. Per questa richiesta il token di accesso è un parametro obbligatorio.

Se il token di accesso fornito non è valido o è scaduto, Facebook restituirà semplicemente un messaggio di errore di qualche tipo.

Per un token di accesso valido il risultato sarà in qualche modo simile a questo

{
   "id": "ID_VALUE"
}

14
La richiesta non riuscirebbe se l'utente fornisse un access_token che appartiene a un'app diversa?
Yuriy Nemtsov

2
È possibile utilizzare qualsiasi token di accesso utente valido (indipendentemente dall'app a cui appartiene)
Robin

12
@Xiquid questo post non è la soluzione al problema poiché non convalida se il token di accesso appartiene alla tua applicazione.
Kolyunya

12
Non capisco perché questa risposta abbia il maggior numero di voti! OVVIAMENTE non è la soluzione giusta. In realtà, l'approccio corretto è quello suggerito da "Sebastian il granchio". L'endpoint debug_token viene utilizzato per interrogare le informazioni sul token stesso e in questo modo puoi verificare che il token appartenga a un ID utente specifico per un ID app specifico!
Alex Ntousias

4
Sì, questa risposta non è corretta. Se verifichi il token di accesso in questo modo, qualcuno può ottenere un token di accesso da un'applicazione diversa e utilizzarlo per autenticarsi con la tua.
Jonathan

11

Un'altra soluzione potrebbe essere quella di utilizzare https://graph.facebook.com/app/?access_token=[user_access_token]come descritto da Ottieni l'ID dell'applicazione dal token di accesso utente (o verifica l'applicazione di origine per un token) .

Questa sembra essere una funzionalità non documentata, ma restituisce JSON contenente l'ID dell'app per cui è stato generato il token. Se il token non era per la tua app, restituisce 400.


Come posso ottenere le valutazioni di altre attività di Facebook. Cosa devo fare per questo?
Maneesh Rao,

6

Nell'ultima versione di Facebook (2.2) puoi farlo in questo modo:

https://developers.facebook.com/docs/graph-api/reference/v2.2/debug_token

Output di esempio:

{
    "data": {
        "app_id": "THE APP ID", 
        "application": "APP NAME", 
        "expires_at": 1427245200, 
        "is_valid": true, 
        "scopes": [
        "public_profile", 
        "basic_info", 
        "read_stream", 
        "email", 
        "publish_actions", 
        "read_friendlists", 
        "user_birthday", 
        "user_hometown", 
        "user_location", 
        "user_likes", 
        "user_photos", 
        "user_videos", 
        "user_friends", 
        "user_posts"
        ], 
        "user_id": "THE USER ID"
    }
}

Questo significa che dovrai chiamare questo endpoint fb a ogni richiesta? Non c'è un modo migliore?
Jdruwe

Funziona ma richiede il token di accesso. Il token di accesso può essere generato utilizzando la risposta "sebastian the crab" oppure possiamo semplicemente utilizzare appid | appsecret. Fore more Info developers.facebook.com/docs/facebook-login/…
krishnan

Ecco un esempio di uso di questo: stackoverflow.com/a/16947027/32453
rogerdpack

2
private function facebookRequestMe($access_token)
{
    include_once "facebook.php";

    $facebook = new Facebook(array(
        "appId" => "your_application_id",
        "secret" => "your_application_secret"
    ));
    $facebook->setAccessToken($access_token);
    return $facebook->api("/me", "GET");
}

Puoi scaricare l'SDK di Facebook per PHP da GitHub .


1

Se un utente ti ha passato un UID di Facebook che afferma essere suo e vuoi verificare se è legittimo, questa è una funzione Python che la verificherà rispetto al loro token di accesso (un'implementazione della risposta di Robin Jome):

def verify_facebook_id(id, access_token):
    import requests
    import simplejson
    params = {'fields': 'id', 'access_token': access_token}
    text = requests.get("https://graph.facebook.com/me", params=params).text
    json = simplejson.loads(text)
    response_id = json["id"]
    return response_id == id

Questo non convalida che il token sia stato generato "per la tua app" purtroppo ...
rogerdpack

1

Questo è l'unico metodo sicuro per verificare il token utente utilizzando una sola richiesta:

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

Nota che un segno "|" nell'URL sopra non viene utilizzato come OR ma come separatore e deve essere presente dopo aver riempito gli altri campi.

La risposta sarà JSON simile a quella:

{
    data: {
        app_id: {app_id},
        application: {app_name},
        expires_at: {some_number},
        is_valid: {true|false}
        scopes: {array_of_permissions},
        user_id: {user_id}
    }
}

Riferimento: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (il metodo sopra è menzionato in fondo a questa sezione)


C'è un altro modo sicuro con una richiesta: stackoverflow.com/a/36555287/32453
rogerdpack

-1

Insieme a un token di accesso, Facebook invia anche un parametro "expires_in", che è un valore di offset. Usalo per calcolare quando il token di accesso scadrà come NSDate. Quindi quando devi fare una richiesta confronta la data corrente con la data di scadenza.

Prova anche a controllare i codici di stato e le stringhe di risposta che Facebook invia.

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.