Verifique el token de acceso de API de Facebook y el ID de usuario a través del SDK de PHP.

Estoy usando Facebook PHP SDK (v3.2.3, no v4.0) ( https://developers.facebook.com/docs/reference/php/3.2.3 ) en mi servidor, y el Phonegap Facebook Plugin (Master ) ( https://github.com/phonegap/phonegap-facebook-plugin ) instalado manualmente en mi aplicación iOS Phonegap v3.3.0.

Tengo todo configurado correctamente, la aplicación muestra un token de acceso de Facebook y el “ID de usuario” del usuario que realiza la autenticación. El problema es que los tokens de Facebook solo duran aproximadamente 2 meses. Para solucionarlo, creé una tabla que contiene todos los tokens de acceso FB que Facebook ha otorgado a todos mis usuarios basados ​​en FB. Esto funciona muy bien con el botón “Iniciar sesión con Facebook” de mi sitio web.

… Pero como este complemento Phonegap deja el dispositivo como intermediario entre Facebook y mi base de datos, necesito que mi servidor verifique con Facebook directamente para verificar que la identificación del usuario y el token de acceso proporcionados por el usuario sean genuinos. He visto que puedo consultar https://graph.facebook.com/app?access_token=TOKEN o hacer algo como:

 GET /debug_token? input_token={input-token}& access_token={access-token} 

… y aparentemente recupero todo lo que necesito, pero tengo la sensación de que un atacante podría seguir golpeando mi script PHP que verifica con Facebook una y otra vez hasta que encuentre el éxito, y entonces tendría las credenciales necesarias para acceder a mi aplicación en nombre de ese usuario cuya ficha supusieron.

Si la idea de que un atacante adivine cualquier token de acceso de Facebook durante unas pocas semanas es ridícula, házmelo saber. Pero esperaba reducirlo y forzar al atacante a saber también de qué usuario están adivinando el token de acceso: ESO debería ser casi imposible de descifrar. Entonces, ¿cómo puedo verificar que un usuario use AMBOS el token de acceso del usuario y la ID numérica del usuario?

Obtenga la ID de Facebook de los usuarios cada vez que obtenga un token y use la identificación del usuario de Facebook para buscar a su usuario.

Incluso si su aplicación requiere acceso sin conexión y usa un token guardado, valide el token antes de usarlo.

Si no valida el token, su aplicación aún puede funcionar si el usuario se desconectó de Facebook o tal vez no autorizó su aplicación.

 $facebook = new Facebook(array( 'appId' => , 'secret' => , )); $facebook->setAccessToken($_REQUEST['access_token']); if (($userId = $facebook->getUser())) { // $_REQUEST['access_token'] is valid token for user with id $userId } 

No debes preocuparte porque el atacante adivine el token de acceso. El token de acceso tiene 211 caracteres de largo y contiene alrededor de 62 tipos de caracteres (según mi token). Eso es 62 ^ 211 token de acceso único. Solo hay 7 mil millones de humanos en el mundo, por lo que es prácticamente imposible forzar una ficha de acceso. Sin embargo, este tipo de ataque es responsabilidad de FB para generar un mejor access_token.

Digamos que el token de acceso se filtró a un delincuente: si está sugiriendo que compare con el ID numérico de FB del usuario, ¡no lo haga! La identificación es accesible con el token de acceso. En su lugar, asigne su propio ID / nombre de usuario único a un usuario cuando se registra por primera vez o algo así.