8

Estoy desarrollando una aplicación para Android. Con la inminente desaprobación del permiso offline_access de Facebook, estoy tratando de usar Graph API para extender el token de Facebook.¿Cuál es el código para obtener un token de Facebook actualizado en una aplicación de Android?

 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 

¿Puede cualquier persona proporcionar código detallado que muestra cómo implementar el código anterior en una aplicación para Android y obtener el token de refrescado Facebook?

Gracias por su tiempo.

actualizar dos:

Progreso (creo)!

Utilizando la URL completa con la solicitud facebook método da como resultado la URL base que se añade al comienzo de la URL Así que en lugar de

String refreshUrl = "https://graph.facebook.com/oauth/access_token?client_id=12345678910&client_secret=abcdefghijklmnopqrstuvwxyz&grant_type=fb_exchange_token&fb_exchange_token="+currentAccessToken; 

debe utilizar

String refreshUrl = "oauth/access_token?client_id=12345678910&client_secret=abcdefghijklmnopqrstuvwxyz&grant_type=fb_exchange_token&fb_exchange_token="+currentAccessToken; 

Sin embargo, estoy ahora obteniendo la respuesta {"error": {"mensaje": "Error al validar la aplicación. ID de aplicación no válida.", "tipo": "OAuthException", "código": 190}}

Actualización Uno:

Esto es lo que he intentado. El código se completa, es decir, se llama a OnComplete en el listerner, PERO la respuesta no contiene un nuevo token de acceso o valor de caducidad.

void refreshWithGraph() { 
     AsyncFacebookRunner extendingAsyncRunner = new AsyncFacebookRunner(facebook); 
     Bundle parameters = new Bundle(); 

     //the variable currentAccessToken is obtained after authorisation is complete using currentAccessToken = facebook.getAccessToken(); 

     String refreshUrl = "https://graph.facebook.com/oauth/access_token?client_id=12345678910&client_secret=abcdefghijklmnopqrstuvwxyz&grant_type=fb_exchange_token&fb_exchange_token="+currentAccessToken; 


    extendingAsyncRunner.request(refreshUrl, parameters, new RefreshListener(), null); 
    } 

aquí está mi versión de RefreshListener ...

//REFRESH LISTENER 
    public class RefreshListener extends BaseRequestListener { 

     public void onComplete(final String response, Object state) { 


      try { 
       final JSONObject json = Util.parseJson(response); 

       runOnUiThread(new Runnable() { 

        @Override 
        public void run() {    
         tvRefreshResponse.setText("IN REFRESH LISTENER ONCOMPLETE\nResponse is " + response); 
         tvRefreshToken.setText("IN REFRESH LISTENER ONCOMPLETE\nToken is " + facebook.getAccessToken()); 
         tvRefreshExpiry.setText("IN REFRESH LISTENER ONCOMPLETE\nFacebook expiry is " + millisecToDate(facebook.getAccessExpires())); 

        } 

       }); //end runOnUiThread 



      } catch (JSONException e) { 
       runOnUiThread(new Runnable() { 

          @Override 
          public void run() { 
           tvRefreshResponse.setText("IN REFRESH LISTENER ONCOMPLETE CAUGHT JSON EXCEPTION \nResponse is " + response); 

          } 

         }); //end runOnUiThread 

      } catch (FacebookError fe) { 
       runOnUiThread(new Runnable() { 


          @Override 
          public void run() { 
           tvRefreshResponse.setText("IN REFRESH LISTENER ONCOMPLETE CAUGHT FACEBOOK ERROR \nResponse is " + response); 

          } 

         }); //end runOnUiThread 
      } //end catch Facebook error 

     } //end onComplete 


     @Override 
     public void onIOException(IOException e, Object state) { 
      tvRefreshResponse.setText("IN REFRESH LISTENER IOEXCEPTION \nException is "+ e.getLocalizedMessage()); 

     } 

     @Override 
     public void onFileNotFoundException(FileNotFoundException e, Object state) { 
      tvRefreshResponse.setText("IN REFRESH LISTENER FILE NOT FOUND EXCEPTION \nException is "+ e.getLocalizedMessage()); 
     } 

     @Override 
     public void onMalformedURLException(MalformedURLException e, Object state) { 
      tvRefreshResponse.setText("IN REFRESH MALFORMED URL \nException is "+ e.getLocalizedMessage()); 

     } 

     @Override 
     public void onFacebookError(FacebookError e, Object state) { 
      tvRefreshResponse.setText("IN REFRESH ONFACEBOOK ERROR \nException is "+ e.getLocalizedMessage()); 

     } 
    } //end RefreshListener 

El código completa, es decir OnComplete en el listerner se llama, pero la respuesta no contiene un nuevo acceso de valor simbólico o de caducidad. La respuesta es ...

{"id":"https:\/\/graph.facebook.com\/oauth\/access_token","shares":78,"comments":1} 

Cuando pongo la misma URL (con un valor de token actual alfanumérico) en un navegador web la respuesta sí incluye un token de acceso.


Datos relativos a

permiso offline_access de Facebook dejará de estar disponible el 1 de de mayo de, 2012

Por favor, no sugieren el uso de la función extendAccessTokenIfNeeded en onResume() en su lugar.I am also having trouble con eso y que es la razón por la que estoy buscando en el :-) refrescante símbolo gráfico API

relacionada desbordamiento de pila Preguntas

Is it possible to extend Facebook tokens with extendAccessTokenIfNeeded in an Android app? (mi pregunta)

How would offline_access work after deprecation after May 1st?

Facebook access token can not be extended

Protecting app secret for extendAccessToken usage (Java/Android)

Relevante Facebook une

Facebook Android Tutorial

Facebook offline_access permission deprecation

+0

Con todos los enlaces de arriba, ¿por qué necesita información más detallada? Parece que tienes suficiente documentación para implementar esto ... – Shreeni

+0

Podrías pensar que podría solucionarlo, pero no. :-(Toda la pregunta fácil sobre Stack Overflow recibe una respuesta completa muy rápido, así que supongo que esto no es tan fácil como parece ... – Mel

Respuesta

7

Para ser honesto, estoy un poco confundido - parece que tiene todo para lograr que se haga - y es sencillo . Pero déjame intentar responder tu pregunta. Aquí está el código de mi proyecto de C#, donde extiendo de contadores a aplicación con mis comentarios en caso de que no está familiarizado con los lenguajes C# y clases:

string currentToken = "token from somewhere"; 

// WebClient is used to send GET request to the given URL 
// and receive the response 
using (var req = new System.Net.WebClient()) 
{ 
    // create URL string and fill it in with data (app Id, secret, and current token) 
    var extendTokenUrl = string.Format(
     "https://graph.facebook.com/oauth/access_token?client_id={0}&client_secret={1}&grant_type=fb_exchange_token&fb_exchange_token={2}", 
     FB_APP_ID, 
     FB_APP_SECRET, 
     currentToken); 

    // send GET request and download the response 
    var response = req.DownloadString(extendTokenUrl); 

    // if all is good, response will be a string which looks like this: 
    // access_token=<<THE TOKEN GOES HERE>> 
    var newToken = response.Substring("access_token=".Length); 

    // now save newToken in your DB INSTEAD of currentToken - 
    // so all calls will be made with extended token 
    SaveTokenInDB(newToken); 
} 

esperanza de que ayuda, y traduciendo esto en Java debe ser sencillo.

+0

Hola gracias por tu respuesta. ¡Estoy confundido! Lo que me dicen es una tarea fácil es no obtener ninguna respuesta de los desarrolladores de Android, ¡incluso con la recompensa de 100 puntos! Mi problema de codificación es que la respuesta de Facebook no contiene una clave de acceso. Sin embargo, cuando acabo de poner toda la URL en un navegador obtengo una clave de acceso. He actualizado mi respuesta para incluir mis intentos anteriores. – Mel

+0

Inmediatamente noté que analizaba JSON en su RefreshListener, pero eso está mal, creo. No está recuperando JSON, sino solo una cadena en bruto. pega el valor de "String refreshUrl" en el navegador, ¿recibirá el token correcto? ¿Está 100% seguro de que está haciendo la solicitud GET (en lugar de POST)? También, ¿tiene fuentes para AsyncFacebookRunner? puede averiguar DÓNDE en realidad envía una solicitud HTTP y registra la URL exacta , El método HTTP allí? Además, si NO utiliza AsyncFacebookRunner sino solo el componente de solicitud HTTP estándar, ¿funcionará? – avs099

+0

Gracias, estoy progresando ... Cuando modifico el código en el código Util.java del SDK (que es la clase que realmente realiza la solicitud http) empiezo a recibir la misma respuesta que al escribir una dirección en el navegador. Pero ahora me doy cuenta de que la cifra de vencimiento es muy pequeña (5143168). Cuando refresco la figura siempre disminuye ... ¿Alguna idea sobre esto? Ejemplo de respuesta ... access_token = AAAEparERUxABAFSPLEI8VNAwo8FLsxOpR6bZAgyeRxj0JAtGBBqMv5y3gnMkvy0TMCrnKuF0Jp6S1DSpiO8mmiy3JMBV2XZASAimYwZDZD & expires = 5143168 – Mel

Cuestiones relacionadas