Validación del lado del servidor de token de acceso de Facebook para la aplicación de iPhone

Estoy desarrollando una aplicación para iPhone, que se basa en la comunicación con el servidor, y quiero usar los mecanismos de autenticación de Facebook.

Básicamente, creo que debería funcionar así:

  1. En mi aplicación de iPhone, el usuario inicia sesión en Facebook, usando su correo electrónico y contraseña.
  2. El usuario permite el acceso a sus datos para la aplicación de Facebook relacionada.
  3. La aplicación de mi iPhone recibe el token de acceso después de iniciar sesión correctamente.
  4. En una mayor comunicación con mi servidor, mi aplicación de iPhone debe usar el token de acceso de Facebook recibido (por ejemplo: en consultas).
  5. Cuando mi servidor recibe alguna consulta de la aplicación iPhone, con un token de acceso, debe preguntarle a Facebook que este token es válido (y para quién) y, en caso afirmativo, el servidor debe suponer que el usuario está autenticado con Facebook.

Mi pregunta es: ¿cómo debe preguntar el servidor a Facebook si el token de acceso dado es válido? Creo que de alguna manera debería verificar si el token es válido para mi aplicación de Facebook.

He intentado muchas consultas de Facebook para graficar la API, que he encontrado, pero nada funcionó como esperaba. ¿Me puedes dar algún ejemplo?

Actualización: esta respuesta parece insegura ya que no valida el token primero como perteneciente a su aplicación, vea los comentarios, respuesta original de la siguiente manera:

Supongo que ya tiene el token de acceso en la mano. En tal caso, la forma más sencilla de validar un token de acceso es emitir la siguiente solicitud

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

Aquí reemplaza @accesstoken con el token de acceso que tienes. Analizaré la url y explicaré cada una.

Estamos emitiendo aquí una solicitud de API gráfica que devolverá la Id. De usuario de Facebook del propietario del token de acceso como una cadena JSON. La palabra clave “me” representa el usuario que inició sesión actualmente o el propietario del token de acceso. Para esta solicitud, el token de acceso es un parámetro obligatorio.

Si el token de acceso provisto no es válido o caducado, Facebook simplemente devolverá un mensaje de error de algún tipo.

Para un token de acceso válido, el resultado de alguna manera se verá así

 { "id": "ID_VALUE" } 

Aquí hay un proceso de dos pasos que puede usar para validar que un token de acceso de usuario pertenece a su aplicación:

1) Genera un token de acceso a la aplicación

( 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) Depurar el token de acceso de usuario

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

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

Donde INPUT_TOKEN es el token de acceso de usuario que desea verificar, y ACCESS_TOKEN es el token de su aplicación que obtuvo del paso 1.

El punto final de depuración básicamente volca toda la información sobre un token, por lo que responderá con algo como esto:

 { 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: [ ] } } 

Si ese token no es de “su aplicación”, devolverá una respuesta de error.

Otra solución sería usar https://graph.facebook.com/app/?access_token=[user_access_token] como se describe en Obtener identificador de aplicación del token de acceso de usuario (o verificar la aplicación de origen para un token) .

Esto parece ser una característica no documentada, pero devuelve JSON que contiene el ID de la aplicación para la que se generó el token. Si el token no era para su aplicación, devuelve un 400.

En la última versión de Facebook (2.2) puede hacerlo de esta manera:

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

Muestra de salida:

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

Puede descargar el SDK de Facebook para PHP desde GitHub .

Si un usuario le ha pasado un UID de Facebook que dicen que es de ellos y desea verificar si es legítimo, esta es una función de Python que lo verificará contra su token de acceso (una implementación de la respuesta de 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 

Este es el único método seguro para verificar el token de usuario con solo una solicitud:

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

Tenga en cuenta que un signo “|” en la URL anterior no se utiliza como OR sino como separador y debe estar allí después de completar los otros campos.

La respuesta será JSON con ese aspecto:

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

Referencia: https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens (el método anterior se menciona al final de esta sección)

Junto con un token de acceso, Facebook también envía un parámetro “expires_in”, que es un valor de compensación. Úselo para calcular cuándo caducará el token de acceso como NSDate. Luego, cuando necesite hacer una solicitud, compare la fecha actual con la fecha de vencimiento.

También intente inspeccionar los códigos de estado y las cadenas de respuesta que Facebook envía de vuelta.