webs valido uso significa restablecer que permite las invalido invalid contraseña cache application aplicaciones php facebook-graph-api facebook-php-sdk oauth-2.0 facebook-oauth

php - valido - Cómo extender la validez del token de acceso desde la desactivación del acceso sin conexión



que es token no valido (7)

Como el Permission offline_access está en desuso en el flujo de Authentication de Facebook, tenemos problemas para generar los tokens de acceso de larga duración sin ese permiso.

En el documento de Facebook sobre la desaprobación , dice, los tokens de acceso generados por OAuth del lado del servidor serán de larga duración, pero no lo son.

¿Me estoy perdiendo de algo? Algunos ajustes en la configuración de la aplicación? ¿Algún código especial que necesito usar para extender el tiempo de expiración de los tokens de acceso? Según entiendo la documentación, para la autenticación del lado del servidor, el token de acceso al que se puede acceder mediante el método getAccessToken() de PHP SDK cuando el usuario está conectado es de larga duración.


// usando un javascript para ventana emergente para el inicio de sesión de facebook

FB.login(function(response) { if (response.authResponse) { var accessToken = response.authResponse.accessToken;

// obtuve el accesstoken con 1-2 horas de tiempo de caducidad

// recibí el accesstoken en un controlador llamado controlador de Facebook

$request = $this->getRequest(); $params = $request->getParams(); $token=$params[''accessToken''];

// tomando el token de acceso para extenderlo a 60 días

$conf = $this->getConfigs(); $appid = $conf[''fbdetails''][''appid'']; $secret = $conf[''fbdetails''][''secret'']; $baseurl = $conf[''app''][''baseurl''];

// Después de la ejecución del código siguiente, tendremos una respuesta con un tiempo de vencimiento del token de acceso de 60 días.

$token_url = "https://graph.facebook.com/oauth/access_token?client_id=".$appid."&client_secret=".$secret."&grant_type=fb_exchange_token&fb_exchange_token=".$token;

// La respuesta anterior se da para el análisis sintáctico.

$c = curl_init(); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($c, CURLOPT_URL, $token_url); $contents = curl_exec($c); $err = curl_getinfo($c,CURLINFO_HTTP_CODE); curl_close($c); $paramsfb = null; parse_str($contents, $paramsfb);

// después de analizar el contenido en el código de ejecución anterior, se almacena el nuevo token de acceso extendido.

$user_session = new Zend_Session_Namespace(''fbuser''); $user_session->access_token = $paramsfb[''access_token''];

// almacenado en la sesión.

$this->_redirect(''/home'');

// Tener una buena codificación


En realidad, lo que se dijo:

Si access_token se genera desde una llamada OAuth del lado del servidor, el access_token resultante tendrá el tiempo de expiración más largo . Si la llamada se realiza mientras todavía hay un access_token válido para ese usuario, el access_token devuelto de esta segunda llamada se mantendrá igual y solo se extenderá el tiempo de caducidad. Nuevamente, llamar esto varias veces durante el mismo día resultará solo en la primera llamada extendiendo el tiempo de vencimiento.

Lo que significa que será más largo que el token generado por el lado del cliente, y para recibir el token extendido (60 días) debe hacerlo manualmente mediante la emisión de una solicitud a:

https://graph.facebook.com/oauth/access_token? client_id=APP_ID& client_secret=APP_SECRET& grant_type=fb_exchange_token& fb_exchange_token=EXISTING_ACCESS_TOKEN

Este token aún puede volverse inválido por varias razones, y cómo manejar esto descrito en Cómo: Manejar el acceso vencido tokens publicación de blog.

Actualizar:
A partir del 07 de agosto de 2012 , puede usar el método setExtendedAccessToken para extender access_token lugar de construir manualmente URL y recuperar detalles.


Inspirado por las respuestas anteriores, escribí un sencillo programa de auto renovación. Primero, simplemente coloque su token actual en el archivo ''token.sec''.

Este programa leerá un token del archivo y actualizará con un nuevo token si todo está bien. En otros programas, solo necesitas usar el token:

$access_token = file_get_contents("token.sec");

Aquí estamos:

<?php $app_id = "<your app id>"; $app_secret = "<your app secret>"; $access_token = file_get_contents("token.sec"); $token_url="https://graph.facebook.com/oauth/access_token?" . "grant_type=fb_exchange_token" . "&client_id=" . $app_id . "&client_secret=" . $app_secret . "&fb_exchange_token=" . $access_token; $ch = curl_init($token_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); if($response === false) { die (''Curl error: '' . curl_error($ch)); } // Close handle curl_close($ch); // parse the output parse_str($response, $params); if(!isset($params[''access_token''])) { die("No access token"); } echo ("New token: $access_token/n"); // eveything looks OK rename("token.sec", "token.sec.back"); // just in case $myfile = fopen("token.sec", "w") or die("Unable to open file!"); fwrite($myfile, $access_token); fclose($myfile); ?>

Finalmente, podemos agregar esto en nuestro crontab para renovar el token una vez por mes:

0 0 1 * * cd /home/<path>; php exchangeToken.php


Si necesita un token de acceso que NUNCA caduca para una PÁGINA , consulte mi respuesta a una pregunta similar here

Desde la página de desarrolladores:

Al usar un token de acceso de usuario de larga duración, la consulta del punto final [ID de usuario] / cuentas ahora proporcionará tokens de acceso a la página que no caducan para las páginas que administra un usuario.


Un token de acceso generado a través de una llamada OAuth del lado del servidor será del tipo extendido (más largo) y no es necesario que lo cambie. Ya es un token extendido. Lo único que debes hacer es habilitar "Depreciar el acceso sin conexión" en la configuración de tu aplicación. Por supuesto, esto solo es necesario si "Deprecate el acceso fuera de línea" se deshabilitó anteriormente.

Luego, cuando autentifique usuarios a través de Facebook, recibirá un token de acceso que durará 60 días. Autenticar varias veces durante el mismo día dará como resultado solo la primera autenticación que extiende el tiempo de caducidad.


esto es para extender el token de acceso a las páginas para que nunca caduque, y extender la vida útil de los tokens de acceso de usuario que caducan después de 2 meses (el ''nuevo token de acceso'').

Ok, tomó aproximadamente una semana de investigación, pero esta es mi solución. en https://developers.facebook.com/tools/explorer/ asegúrate de tener manage_page como parte de tu access_token. después de eso, usa este código con tu id de aplicación, secreto y redirección:

<?php app_id = "APP_ID"; $app_secret = "APP_SECERET"; $post_login_url = "REDIRECT_URL"; $code = $_REQUEST[''code'']; //Obtain the access_token with publish_stream permission if(empty($code)){ $dialog_url= "http://www.facebook.com/dialog/oauth?" . "client_id=" . $app_id . "&redirect_uri=" . urlencode( $post_login_url) . "&COMMA_SEPARATED_LIST_OF_PERMISSION_NAMES"; echo("<script>top.location.href=''" . $dialog_url . "''</script>"); } else { $token_url="https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=". urlencode($post_login_url) . "&client_secret=" . $app_secret . "&code=" . $code; $response = file_get_contents($token_url); $params = null; parse_str($response, $params); $access_token = $params[''access_token'']; echo ''access token: '' . $access_token.''<br>''; if($access_token){ $token_url="https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=". urlencode($post_login_url) . "&client_secret=" . $app_secret .''&grant_type=fb_exchange_token'' . "&fb_exchange_token=" . $access_token; $response = file_get_contents($token_url); $access_token = $params[''access_token'']; echo ''new access token: ''.$access_token; } }*/ ?>

Después de eso, copie el ''nuevo token de acceso'' y regrese a https://developers.facebook.com/tools/explorer/ Cuando llegue allí en su nuevo token de acceso al campo del token de acceso. Luego haz clic en enviar. Después de eso en el nodo, verá un + _ ___ clic en esto y desplácese hacia abajo a las cuentas y haga clic en eso. busque la página para la que necesita el token de acceso y cópiela y péguelo en el campo clave de acceso. haga clic en depuración y verá que nunca caducará. guarda ese token, seguirá siendo válido siempre y cuando no restablezcas el secreto de tus aplicaciones.


Editar (14 de agosto de 2012):
Hace una semana, se actualizó el Facebook PHP SDK oficial. El nombre de la función se cambió a setExtendedAccessToken , y se decidió que realmente necesitábamos destruir la sesión después, para eliminar el riesgo de tener dos sesiones activas.
Además, la función ya no devuelve el token, sino que lo almacena dentro de los datos persistentes. Por lo tanto, puede obtener el nuevo token de acceso con la función pública getAccessToken después. Tome el nuevo SDK de la página oficial de Facebook PHP SDK github para asegurarse de estar actualizado.

Respuesta Original:

He agregado una nueva función pública al archivo base_facebook.php, que devuelve un nuevo token de acceso que vence en 60 días. Puede hacer una solicitud a esta función después de haber recibido el token de acceso normal. No lo he probado, pero supongo que también debe habilitar ''deprecated offline_access'' en su configuración avanzada de Developer App.

Simplemente agregue esto a su base_facebook.php dentro de la clase de Facebook y haga una llamada. Esto funciona para mi.

public function getExtendedAccessToken(){ try { // need to circumvent json_decode by calling _oauthRequest // directly, since response isn''t JSON format. $access_token_response = $this->_oauthRequest( $this->getUrl(''graph'', ''/oauth/access_token''), array( ''client_id'' => $this->getAppId(), ''client_secret'' => $this->getAppSecret(), ''grant_type''=>''fb_exchange_token'', ''fb_exchange_token''=>$this->getAccessToken() ) ); } catch (FacebookApiException $e) { // most likely that user very recently revoked authorization. // In any event, we don''t have an access token, so say so. return false; } if (empty($access_token_response)) { return false; } $response_params = array(); parse_str($access_token_response, $response_params); if (!isset($response_params[''access_token''])) { return false; } return $response_params[''access_token'']; }