¿Cuál es el código para obtener un token actualizado de Facebook en una aplicación para Android?
Estoy desarrollando una aplicación de Android. Con la depreciación inminente del permiso de offline_access de Facebook estoy intentando usar la API de Graph para extender el token de Facebook.
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 alguien proporcionar código detallado que demuestre cómo implementar el código anterior en una aplicación para Android y obtener el token actualizado de Facebook?
- ¿Cómo obtener el token de acceso de usuario de facebook en android?
- Android Facebook Comparte no mostrar descripción en facebook
- La clave de la aplicación de Android no coincide con ninguna hash de clave almacenada
- La devolución de llamada de inicio de sesión no se activa mediante facebook-android-sdk 4
- Facebook Android SDK v4.0.0 ShareDialog NullPointerException issue
Gracias por tu tiempo.
Actualización Dos:
Progreso (creo)!
El uso de la URL completa con el método de solicitud de facebook da como resultado que la URL base se agregue al principio 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;
debería usar
String refreshUrl = "oauth/access_token?client_id=12345678910&client_secret=abcdefghijklmnopqrstuvwxyz&grant_type=fb_exchange_token&fb_exchange_token="+currentAccessToken;
Sin embargo, ahora estoy recibiendo la respuesta {"error": {"message": "Error validating application. Inválido ID de la aplicación.", "Type": "OAuthException", "code": 190}}
Actualizar uno:
Esto es lo que he probado. El código se completa, es decir, OnComplete en el listerner se llama, 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 se completa, es decir, OnComplete en el listerner se llama, pero la respuesta no contiene un nuevo token de acceso o valor 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 token alfanumérico actual) en un navegador web, la respuesta incluye un token de acceso.
Información relacionada
El permiso offline de Facebook será descontinuado el 1 de mayo de 2012
Por favor, no sugiera usar la función extendAccessTokenIfNeeded en onResume (). También estoy teniendo problemas con eso y es la razón por la que estoy buscando en el API de gráfico de actualización de token 🙂
Preguntas relacionadas con el desbordamiento de pila
¿Es posible extender los tokens de Facebook con extendAccessTokenIfNeeded en una aplicación para Android? (mi pregunta)
¿Cómo funciona offline_access después de la depreciación después del 1 de mayo?
No se puede ampliar el token de acceso a Facebook
Protección del secreto de la aplicación para el uso de extendAccessToken (Java / Android)
Enlaces relevantes de Facebook
Tutorial para Android de Facebook
Aprobación del permiso de Facebook offline_access
- Error de Facebook: permitir clave: configurar los hashes de su clave de aplicación en dev.facebook android
- Facebook LoginButton para Android no toma los valores de login_text y logout_text pasados de XML
- Facebook AppInviteContent: El SDK no se ha inicializado, asegúrese de llamar a FacebookSdk.sdkInitialize () primero
- Utilizando facebook sdk en android studio
- Facebook SDK para android: getFirstName () y getLastName () devuelven cadenas null
- No se puede publicar una imagen de drawable a facebook
- Cómo habilitar las pestañas personalizadas de Chrome para iniciar sesión en Facebook con Android SDK
- Facebook SDK 3 EOFException
Para ser honesto, estoy un poco confundido – parece que tienes todo para hacerlo – y es simple. Pero déjame tratar de responder a tu pregunta. Aquí está el código de mi proyecto de C # donde extiendo el token de la aplicación con mis comentarios en caso de que no esté familiarizado con los idiomas y clases de C #:
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 que ayuda, y traducir esto en Java debe ser directo.
- IllegalStateException cuando .replace el fragmento al reiniciar
- NineOldAndroids, no haga clic en la vista después de rotación o movimiento