37 votos

¿Cómo manejar la sesión correctamente y acceder a ficha con Facebook PHP SDK 3.0?

En el PHP 3.0 SDK no hay getSession() o cualquier período de sesiones, manejo de fuera de Facebook api disponible. Hace algunos días los desarrolladores de facebook han también, de alguna actualizado el sdk de JavaScript, de acuerdo a esta entrada de blog y este informe de error.

En los últimos días, un cambio de era introducido en la alojado JS SDK que rompió todos los compatility entre y el actual PHP SDK (2.x y 3.x). Los desarrolladores que utilizan tanto el JS y PHP SDK en sus sitios web es probable a ver del lado del servidor de la API de fracaso.

Sin embargo, no sé si es que realmente los efectos de mi problema. Como en esta pregunta la respuesta que estoy recuperando el token de acceso de OAuth de diálogo con PHP y guardar el nuevo token de acceso en la sesión.

Solución actual

El código siguiente muestra cómo yo soy el manejo de este periodo de sesiones. $_REQUEST['session'] es el contenido de la respuesta de la OAuth de diálogo.

if(isset($_REQUEST['session'])) {

    $response = json_decode(stripslashes($_REQUEST['session']), true);

    if(isset($response['access_token'])) {
        $this->api->setAccessToken($response['access_token']);
        $_SESSION['access_token'] = $this->api->getAccessToken();
    }

}
elseif(isset($_SESSION['access_token']) && ! isset($_REQUEST['signed_request'])) 
    $this->api->setAccessToken($_SESSION['access_token']);
elseif(isset($_REQUEST['signed_request'])) {
    Session::invalidate('fbuser');
    $_SESSION['access_token'] = '';
}

Aquí es cómo puedo manejar los datos de usuario:

try {
    $this->user = Session::getVar('fbuser');
    if ($this->user === false || is_null($this->user)) {
        $facebookUser = $this->api->api('me?fields=id,name,first_name,last_name');
        $this->user = new FBUserModel(array('fbId' => $facebookUser['fbId'], ...));
        Session::setVar('fbuser', $this->user);
    }
}


El Problema

Todo parece bien durante las pruebas. Sólo una vez que ha ocurrido un error: la primera vez después de permiso. Ahora, ya que la app está en línea, parece como si el error se produce en promedio con cada segundo de usuario en

$facebookUser = $this->api->api('me?fields=id,name,first_name,last_name');

con el error:

An active access token must be used to query information about the current user.


Pregunta

Entonces, ¿por qué está sucediendo esto? Es muy difícil depurar desde el error parece que sólo se producen cuando un usuario entra en la aplicación la primera vez, después de la aplicación de autenticación y el token de acceso ha cambiado. Y hasta que no está sucediendo en cada momento. ¿Cómo debo manejar la sesión y el token de acceso de la derecha con el nuevo SDK para PHP?

Cualquier ayuda sería muy appreciatied!


Editar

Me enteré de que hay algunos problemas con IE con las cookies de sesión o dentro de un iFrame. Como se ha visto en este blog. Con esa sugerencia y una investigación más he añadido las siguientes líneas en mi bootstrap:

ini_set('session.use_trans_sid', 1);
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');

Ahora es mucho mejor, pero la información de alrededor de 2 de 50 usuarios perderse entre los pasos de la página de destino (autenticación) -> formularios -> y registro. Así que todavía hay algo que me perdí.


Edit 2

He editado mi usuario el manejo de

if ($this->user === false || is_null($this->user)) {
    // get user data
}

a

if ((is_object($this->user) && $this->user->fbId == '') || $this->user === false || is_null($this->user)) {
    // get user data
}

Esto parece ayudar un poco. Yo creo que el principal problema está en algún lugar en mi sesión.

Además he añadido un bloque try/catch para ver si en algún lugar en mi app de Facebook OAuthException es lanzado. Si este es el caso, me redirigir la ubicación de la parte superior para el Facebook de la Página y la Ficha para obtener una nueva solicitud firmada. A pesar de que esto podría ayudar a resolver este problema, quiero evitar que mi app de tener que redirigir al usuario.


Edición 3

Después de algunos días de intensa depuración y registro me enteré, que el $_REQUEST['session'] procedente de la FB.interfaz de usuario permisos.método de solicitud está vacía con poca frecuencia.

He aquí cómo manejarlo:

Esta es de las cosas que siempre se incluye:

FB.provide("UIServer.Methods", {'permissions.request': {size : {width: 575, height: 300}, url: 'connect/uiserver.php', transform : FB.UIServer.genericTransform}});

Y se llama a esta función en el formulario de envío. Siempre trabajó para mí, pero de alguna manera todavía se envía el formulario a pesar de session == ''.

function getPermission(form) {

    session = $('#' + $(form).attr('id') + ' input[name="session"]');

    if($(session).val() != '') {
        form.submit();
        return;
    }

    FB.ui({method: "permissions.request", "perms": 'user_photos'}, function callback(info){
        if(info.status=='connected' && info.session !== null) {
            $(session).val(JSON.stringify(info.session));
            form.submit();
        }
    });
    return;
}

10voto

Hamza Puntos 506

Ahora estoy usando PHP SDK 3.x sin ningún problema.

Naitik el autor clase elimina la función getSession() y ahora si quieres saber si el usuario está autenticado o no, use getUser().

Para el token de acceso, es muy simple, utilice esta función getAccessToken()y obtendrás el token de acceso para hacer llamadas gráfico o API Rest .

$user = $facebook->getUser();

if ($user) {
//USER Logged-In
}
else {
//USER not Logged-In
}

//TO GET ACCESS TOKEN
$access_token = $facebook->getAccessToken();


//MAKE AN API CALL WITH IT
$user_info = $facebook->api('me?fields=id,name,first_name,last_name&access_token='.$access_token);

5voto

Sascha Galley Puntos 7516

Mi solución

Bueno, ya que todo lo que yo hacía era sólo una solución temporal hasta que el nuevo JS SDK sale, parece que no hay mejor práctica. Configuración de session.use_trans_sid a 1 y la adición de la P3P encabezado ayudado a superar el IE iFrame cookie temas (ver mi primera edición). Después de unos días de fuertes depuración me enteré, de que FB.la interfaz de usuario de permission_request no enviar un nuevo token de acceso cada vez que (<5%).

Si esto sucede, algo salió mal. Pero este poco de algo que me está volviendo loco. Como esto sucede con poca frecuencia, puedo soportar redirigir a los usuarios a la facebook tab para obtener una nueva solicitud firmada. Con la nueva JS SDK, esperemos que esto no vuelva a suceder nunca mas.

Actualización: solución final

Hubo un poco de cosa que me ha supervisado y la solución se puede encontrar aquí: FB no está definido el problema
No me carga el JS SDK de forma asincrónica! Esto lo explica todo. A veces la all.js el archivo no se ha cargado suficientemente rápido, así que hubo un error de JS. Debido a que, ni el permiso de diálogo ni el JS de validación trabajado y un vacío #sesión de valor de entrada fue enviado.

2voto

Maciej Łebkowski Puntos 2869

Para empezar, me gustaría que depurar un poco más. Registra el contenido de las solicitudes. Lo que se almacena en $_SESSION, lo que pasa en $_REQUEST. También, comprobar si es un problema del navegador (es lo que está sucediendo sin importar el navegador, o es que hay un patrón?)

Pero desde la fijación de la cookie problema en IE (P3P encabezado) ayudó, mi conjetura es que hay algunos navegadores a la izquierda, que niegan las cookies de terceros. Hasta donde yo sé, algunas versiones de Safari y Opera hace que de forma predeterminada. Además, este error indica que no existía access_token siempre, como contraposición a la no válido o caducado.

Usted puede probar que mediante la desactivación de las cookies de terceros (usando about:config de firefox , por ejemplo), desautorizar su aplicación (usando la "Aplicaciones y sitios web" en la parte inferior de Facebook configuración de Privacidad), la eliminación de las cookies (relacionados con su lienzo URL) y, a continuación, iniciar la aplicación.

Por CIERTO, siempre hay una posibilidad de que facebook no devolver el token de acceso, incluso cuando se debe, como se describe en el bug 17236

1voto

benny Puntos 11

Hola me he quedado en el mismo problema parece que lo he resuelto con la API JS que miraba y redirigir a la página de Login PHP SDK si la información de usuario es legible

ejemplo:

<script language="JavaScript">

function check_fb_status(){
    FB.api('/me', function(response){
     if(response.name) window.location='<?php echo $facebook->getLoginUrl(); ?>';
     else check_fb_status();
    });
}

check_fb_status();

</script>

Si el script succed carga el loginpage y el usuario tiene reconocido por JS y PHP SDK ;)

0voto

Rob DiMarco Puntos 3852

FYI, Facebook publicada una actualización al PHP SDK hace 2 horas que añade soporte para el nuevo formato de galleta, si está creando una sesión en el cliente utilizando el SDK de JavaScript. La actualización puede encontrarse en el Facebook PHP SDK GitHub repo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X