Pregunta

Estoy trabajando en un proyecto que utilizará la autenticación de Facebook por completo (no existe implementación de autenticación personalizada). El proyecto utiliza PHP para secuencias de comandos del lado del servidor. Busqué implementar un mecanismo de autenticación rápido y seguro, pero no puedo encontrar ninguna descripción detallada sobre este tema. Los documentos de Facebook son débiles y solo proporcionan información básica.

¿Qué método de autenticación sería apropiado? Hay un JavaScript SDK y PHP SDK. Según tengo entendido, tengo que usar JavaScript SDK para iniciar sesión, luego, utilizando PHP SDK, verificaré mi base de datos para verificar las credenciales. Pero usar API gráfica con PHP SDK es lento. ¿Hay una mejor manera de validar la sesión?

¿Tendré que verificar el lado del servidor de sesiones (PHP-SDK) en cada solicitud?

¿Fue útil?

Solución

Lo que termino haciendo para mis aplicaciones es bastante simple y relativamente rápido en comparación con cualquier otro método que haya visto.

  1. Verifique el Firmed_Request si existe, analízalo si lo hace. Si no es así, establezca el indicador de inicio de sesión de $ en 1 en PHP
  2. Compruebo la sesión / cookie del usuario para ver si el usuario fue autenticado previamente por la aplicación (volverá a esto más tarde. Si está vacío, configure $ inicio de sesión en 1.
  3. Si el indicador de inicio de sesión se establece en 1, envíe al usuario a la URL de instalación.
  4. El usuario instala la aplicación y se envía a una página de conector. Esta página tiene el propósito de obtener un Access_Token y generar una sesión / cookie para el usuario. Esto significa que es probable que no necesite verificar la validez de este Access_Token para la vida de la sesión del usuario. Offline_access también crea nuevas oportunidades. También puede almacenar el Access_Token en su DB.
  5. Siempre que tenga una llamada que salga a Facebook, verifique las excepciones, si presenta una excepción de autenticación, borre la sesión y la cookie del usuario. La próxima vez los obligará a actualizar su access_token, incluso si este proceso es invisible para el usuario.

He hecho esto en mis aplicaciones, en la mayoría de los casos, significa que no tengo que hacer consultas en FB para ver la validez del Access_Token ni tengo que obtenerlo constantemente en cada vista de página. Nuestro objetivo era reducir la latencia en nuestras aplicaciones, pero Facebook fue la mayor fuente de latencia, hacerlo lo ha reducido considerablemente.

Otros consejos

Respondiendo a mi propia pregunta:

Utilicé JavaScript SDK para verificar la autenticación de Facebook está disponible.

  • Si la autenticación de FB está bien y mi aplicación no se autentica, le presento al usuario un formulario de registro prefellado de Facebook.
  • Si la autenticación FB no está bien, presento un botón de inicio de sesión de Facebook.

El complemento de registro autoriza mi aplicación y llamo a mi fblogin.php para verificar esta información usando PHP SDK. Cuando PHP SDK valida la autorización, almacena esta información sobre una variable de sesión. Por lo tanto, no hay necesidad de verificar la autenticación de FB en cada solicitud.

El botón de inicio de sesión hace lo mismo que el complemento de registro. Estos métodos comparten la misma funcionalidad del lado del servidor, pero su representación es diferente.

Para atrapar el estado de cierre de sesión de Facebook, utilicé JavaScript SDK para validar la autenticación de Facebook en cada solicitud. Si el usuario se registra, mi código JS llama a fblogout.php y se destruye la sesión actual. Hay un defecto en este método. Si un usuario no cierre la sesión desde mi sitio web explícitamente, un atacante podría hacer cualquier cosa en nombre del usuario solo deshabilitando JS en la misma máquina.

No puedo encontrar una mejor solución con un tiempo de respuesta rápido.

Puede usar uno u otro o ambos.

Puede usar PHP SDK para generar las URL relevantes para enviar a las personas. Y solo arruín eso en un enlace. O puede usar JavaScript para hacer el botón de inicio de sesión predeterminado de Facebook.

Después de eso, puede usar uno u otro para mantener y verificar la sesión.

Generalmente uso PHP para hacer el trabajo que gruñe con las teclas OAuth y uso JavaScript SDK para hacer los buenos botones de Facebook y algunas llamadas gráficas menos importantes para el monitoreo de la sesión.

Cualquier cosa que involucre cualquier llamada gráfica pesada o múltiple que empuje a PHP.

Pero hay flexibilidad allí para hacer lo que quieres. No tiene que usar JavaScript SDK para iniciar sesión.

Depende de usted si desea verificar cada carga de página o no.

Tiendo a usar el JavaScript SDK para manejarlo y, como Berk, si la sesión está muerta. Llame a una redirección de página a un script de cierre de sesión.

A partir de las últimas versiones, PHP y JS SDK ahora pueden acceder a la misma sesión de usuario (inicie sesión con JS o PHP [en lugar de tener que hacer ambas cosas]). Verificar esta publicación de blog Para una explicación más detallada y un ejemplo.

Si le preocupa la seguridad, tal vez podría establecer la cookie de la sesión para expirar antes session_set_cookie_params ().

Primero, recuérdele que deberá guardar no solo Access_Token, sino idealmente, le gustaría guardar el UID de Facebook del usuario junto con el token de acceso. Esto porque, por lo general, deberá incluir el UID junto con el token de acceso en su llamada API.

Segundo, de Documentación de Facebook

Nota: Si la aplicación no ha solicitado el permiso de Offline_Access, el token de acceso está limitado por el tiempo. El token de acceso limitado por el tiempo también se invalida cuando el usuario inicia sesión en Facebook. Si la aplicación ha obtenido el permiso de Offline_Access del usuario, el token de acceso no tiene una cadena. Sin embargo, se invalida cada vez que el usuario cambia su contraseña.

Tercero, el propósito de tener Access_Token y UID es realizar una llamada API, ¿verdad? Empiece desde allí. Haga la autentificación, si solo el Access_Token (de alguna manera) se vuelve inválido. ¿Cómo verificar si es válido o no entonces? Bueno, puedes usar curl (Referencia) o Biblioteca(Pero es posible que deba modificarlo lil bit, ya que originalmente fue escrito para CI) para hacer una llamada API como procedimiento de validación. Muestra (*suspiro, usando mi biblioteca proxy) ...

// Suppose we are try to publish a status from our fb app
// $access_token hold the user access_token, which you saved into your database
// $uid hold the user facebook uid, which you saved into your database
$proxy = new Proxy;
// This is equal with perform regular HTTP POST request with cURL
$api_call = $proxy->http('post','https://graph.facebook.com/'.$uid.'/feed', array('access_token' => $access_token,'message' => 'foo'));

// Now we can validate...
// If the API success, it will be returned a post id, with json format
// if not, it will be outputing json like...
// "{"error":{"type":"OAuthException","message":"Invalid OAuth access token."}}"
// so...
$result = (array) json_decode($api_call);
if(array_key_exists('error', $result))
{
    // Here you can perform an oAuth authentification, to get fresh access_token and update your database
    // ...
    // After it done, process the previous api call with valid access_token
    $proxy->http('post','https://graph.facebook.com/'.$uid.'/feed', array('access_token' => $access_token,'message' => 'foo'));
}

La documentación de Facebook Connect es bastante limitada. Realmente no te dice qué está haciendo, solo cómo hacerlo. Personalmente no uso SDK. He creado mi propio marco para mis proyectos de desarrollo.

Tanto los SDK como el JavaScript en el tutorial están, en mi opinión, bastante anticuados.

Si quieres seguir con uno de los SDK de FB, aquí está mi sugerencia. Use el JS SDK solo si sus consultas de API de gráficos y similares se envían a un backend de PHP a través de AJAX. De lo contrario, quédese con el PHP SDK.

Introducción

Facebook usa OAuth V2. Describen dos métodos diferentes de flujo ... lado del servidor y lado del cliente. Esto se implementaría igual que cualquier otra aplicación que se autentica contra un servicio OAuth V2. Ambos hacen la misma cosa. La única diferencia puede ser que puede usar 'código' como request_type para obtener un código de autorización para obtener un token en el futuro.

Autenticación

En lo que respecta a FB Connect, su script es necesario para asegurarse de tener un token de autenticación o un código de autenticación siempre que necesite autenticación. Si no tiene eso, entonces necesita obtenerlo. Puede usar la presencia de un código de autenticación o token como condición para la cual se muestra el botón FB (iniciar sesión o inicio de sesión).

Redirige al usuario a OAuth para la autenticación. Facebook tiene su implementación de OAuth en su API de diálogo. Más información sobre el diálogo OAuth aquí: http://developers.facebook.com/docs/reference/dialogs/oauth/

Puede usar el parámetro de estado opcional para algo como la protección CSRF. Conserva su valor después del proceso y se envía con la devolución de llamada como un parámetro GET.

Interacción de la aplicación

Básicamente, escribirás tu aplicación de la misma manera que normalmente lo harías. Las diferencias serían:

  1. Su base de datos de usuario ya no almacena una contraseña, solo el UID FB. Además, de acuerdo con el FB Dev TOS, realmente no puede almacenar ninguna información del usuario. Si desea almacenar información del usuario, debe obtenerla del usuario. Puede completar esta información para ellos con información de FB, solo necesita que la envíen.
  2. Su método de registro ya no tendrá un formulario de publicación frontend. Se llamará cuando un usuario autenticado no tenga una entrada en el DB.

Interacción API

Si fue con código en lugar de token, debe solicitar un token enviando código. Esto se hace con el gráfico API OAuth. Esta parte no está documentada en absoluto que no sea en su tutorial de autenticación. http://developers.facebook.com/docs/authentication/

Con su token de acceso, cualquier método que haya utilizado para obtenerlo. Ahora puede consultar la API del gráfico como desee. Esto devolverá un objeto codificado JSON.

Conclusión

En cuanto a una implementación rápida y segura, el SDK de Facebook PHP hace el trabajo. Maneja todo lo que cubrí aquí, incluido el CSRF. Cómo aprenderlo, todavía tengo que encontrar una documentación decente en ello. Todo es viejo o el escritor realmente no lo sabe y sale de otros tutoriales.

Su mejor opción es profundizar en esas bibliotecas y descubrir cómo funciona para usted. Haz un poco de prueba y error, experimente.

La forma en que aprendí fue escribiendo mi propio marco para ello. Te sugiero que hagas lo mismo. Puede extender las clases SDK de Facebook si lo desea. Es realmente limitado, pero te da todo lo que necesitas. Tomé mis llamadas API más utilizadas y las coloqué también. Ahora tengo un resultado final muy rápido y simple que se conduce desde mi biblioteca.

Creo que no necesitas implementar SDK.

1, debe obtener el permiso del usuario, para acceder a sus datos. Entonces debes redirigirlos a Facebook. Es pocas (3-5) línea de código en PHP.

https://graph.facebook.com/oauth/authorize?
client_id=YOUR_APP_ID&scope=email&redirect_uri=APP_URL 

2, cuando el usuario llegue de regreso a su sitio, ven con $ _get ['código'

http://YOUR_URL?code=A_CODE_GENERATED_BY_SERVER

3, debe decodificar este código a través de la solicitud Get Facebook y obtener el Access_Token.

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&
client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

3, después de tener el Access_Token, solo ejecute A /ME?

4, puedes almacenar la identificación de Facebook.

Creo que esta es la forma más rápida. Hasta donde yo sé, el SDK de JavaScript usa emergente, lo que está bloqueado en la mayoría de los navegadores.

Este flujo se detalla lo suficiente aquí: http://developers.facebook.com/docs/authentication/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top