¿Cómo verificar el token de acceso de Facebook?

108

Solo hay una cosa que el servidor tiene que hacer; simplemente verifique la validez de cualquier token de acceso.

Los clientes envían al servidor la identificación de usuario y el token de acceso obtenido por FB.getLoginStatus. Como esperaba, habría cualquier URL que verifique la validez del token de acceso, como http://xxx.facebook.com/access_token?=xxxxxxxxxxxxxxxxxxxxxxxxxxxx.

Eso devuelve si está disponible o no o hay alguna API (lado del servidor) para eso?

Así que Jae Kyung
fuente
2
¿Por qué no llamar a graph.facebook.com/me/permissions?
Igy
Consulte también stackoverflow.com/questions/8141037/…
Vadzim
3
Hay una buena interfaz de usuario developers.facebook.com/tools/debug/accesstoken
Clergyman

Respuestas:

136

El método oficialmente admitido para esto es:

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

Ver los documentos del token de verificación para obtener más información.

Un ejemplo de respuesta es:

{
    "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
fuente
24
Creo que es engañoso decir que es más probable que Facebook introduzca cambios importantes. No dicen eso en ninguna parte y sus documentos oficiales dejan en claro que esta es la forma de validar el token de acceso
Ed Sykes
1
@rynop, bueno, el nombre del punto final de la API es "debug_token", y se describe en una sección de la documentación de la API de Facebook denominada Obtener información sobre tokens y depuración . Esta sección de la documentación se denomina anclaje HTML #debug, y establece que la API es el back-end de su herramienta de depuración. Me parece bastante claro, pero tienes razón en que técnicamente, en ninguna parte se indica clara y directamente que la función no está destinada al uso de producción ... :-)
Jonathan Gilbert
5
El problema principal aquí es que usar el método me? Access_token es simplemente incorrecto si los datos provienen del lado del cliente; Dado que cualquier sitio puede buscar tokens, utilícelos para autenticarse en su sitio accediendo a su api.
srcspider
4
El OP quería verificar la identificación de usuario asociada con el token. El punto final / me devuelve el ID de usuario, pero solo si el token de acceso es válido (porque, después de todo, el token se usa para determinar qué "yo" devolver). Entonces, tome / me y compare las ID de usuario. Debe tenerse en cuenta que cada aplicación obtiene sus propias ID de usuario de ámbito especial, por lo que no puede comparar las ID de una fuente diferente con el / me que obtiene con el token de su propia aplicación.
Jonathan Gilbert
3
En el pasado, los documentos podrían tener referencias que usan esto para depurar. Pero actualmente sugiere que este es exactamente el caso de uso.
AndHeiberg
78

Simplemente puede solicitar https://graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx si recibe un error, el token no es válido. Si obtiene un objeto JSON con una propiedad id, entonces es válido.

Desafortunadamente, esto solo le dirá si su token es válido, no si proviene de su aplicación.

Andy Muth
fuente
9
Lo siento, mi pregunta no estaba clara. El problema es cómo verificar al usuario solo con uid y accessToken. graph.facebook.com/100000726976284?access_token=xxxxxx Por ejemplo, ¿hay alguna forma sencilla de comprobar si el token de acceso del usuario 100000726976284 es xxxxxx? Supongo que el archivo 'verificado' es la clave. Solo cuando puse xxxxxx correcto, pude ver verificado = verdadero en la respuesta.
So Jae Kyung
14
Solicite graph.facebook.com/me?access_token=xxxxxxxxxxxxxxxxx como se mencionó anteriormente, y luego verifique que el uid que tiene coincida con el id devuelto desde la solicitud.
AlexQueue
51
Esto no verificará que el access_token sea para su aplicación.
Ed Sykes
Tampoco proporciona expires_atinformación.
Vinesh
4
downvoting, de acuerdo con @EdSykes, de esta manera no se puede comprobar si token de acceso pertenece a su aplicación developers.facebook.com/docs/facebook-login/security
Nikis
35

Solo quería hacerle saber que hasta hoy, primero obtenía un token de acceso a la aplicación (a través de una solicitud GET a Facebook) y luego usaba el token recibido como app-token-or-admin-tokenen:

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

Sin embargo, me acabo de dar cuenta de una mejor manera de hacer esto (con el beneficio adicional de requerir una solicitud GET menos):

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

Como se describe en la documentación de Facebook para tokens de acceso aquí .

Andy
fuente
6
Gracias. Nota para los demás: el literal "|" se debe incluir un carácter (que no indica 'o') como se muestra en la página vinculada en la respuesta: developers.facebook.com/docs/facebook-login/…
Mike S
1
¿No es esto inseguro? Enviar el secreto de la aplicación a través de parámetros de consulta de URL lo expone a cualquier persona "en el medio" entre su servidor y Facebook y HTTPS no ayudará, ya que las URL no están encriptadas. Cualquiera podría simplemente "escuchar" (rastrear) solicitudes con URL en formato debug_token y robar los secretos de las aplicaciones de Facebook.
Simeon
@Xeing gracias, veo que tenía la impresión equivocada :) Parece que la parte del host de la URL no está cifrada.
Simeon
1
Añadiendo el '|' con el secreto de la aplicación finalmente me puso en marcha. De lo contrario, esta API no funciona.
Uday
4

Simplemente solicite (HTTP GET):

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

Eso es.

Nadav B
fuente
1

Exchange Access Tokenpara Mobile Number and Country Code(lado del servidor o lado del cliente)

Puede obtener el mobile numbercon su access_tokencon este API https://graph.accountkit.com/v1.1/me/?access_token=xxxxxxxxxxxx . Tal vez, una vez que tenga el mobile numbery el id, pueda trabajar con él para verificar al usuario con suserver & database .

xxxxxxxxxx arriba está el Access Token

Respuesta de ejemplo:

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


Exchange Auth Codepor Access Token(lado del servidor)

Si tiene un Auth Codeen su lugar, primero puede obtenerlo Access Tokencon esto API: https://graph.accountkit.com/v1.1/access_token?grant_type=authorization_code&code=xxxxxxxxxx&access_token=AA|yyyyyyyyyy|zzzzzzzzzz

xxxxxxxxxx, yyyyyyyyyyy zzzzzzzzzzarriba son Auth Code, App IDy App Secretrespectivamente.

Respuesta de ejemplo

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

Nota: esto se prefiere en el server-sideya que APIrequiere el APP Secretque no está destinado a ser sharedparasecurity reasons .

Buena suerte.

Akash
fuente