Uso de los detalles de autenticación de Dropbox guardados en Android

En el artículo Getting Started en el sitio web de Dropbox, tienen un tutorial sobre cómo usar Core API with Android para empezar.

Cuando se inicia la aplicación por primera vez, se pide al usuario que autentique el software para usar la cuenta Dropbox de usuarios. Una vez finalizada la autenticación, recibirá un par de cadenas de autenticación, la clave y un secreto.

Después de que el usuario haya autenticado la aplicación para usar su cuenta de Dropbox, guardo la clave y el secred usando SharedPreferences de Android.

¿Cómo utilizo estos valores guardados? No me refiero a cómo recuperarlos con SharedPreferences, pero ¿cómo uso estos para evitar la necesidad de volver a autenticar la aplicación de nuevo? En el sitio de Dropbox no proporcionan una forma de utilizarlos. Todo lo que dicen es

El método finishAuthentication () enlazará los tokens de acceso del usuario a la sesión. Ahora podrá recuperarlos a través de mDBApi.getSession (). GetAccessTokenPair ().

Necesitará estos tokens una vez finalizada la aplicación, por lo que es importante guardarlos para acceso futuro (aunque no se muestra aquí). Si no lo hace, el usuario tendrá que volver a autenticarse cada vez que utilicen su aplicación. Una forma común de implementar el almacenamiento de claves es a través de la API SharedPreferences de Android.

Tuve el mismo problema, la documentación no es genial, así que vi varias preguntas relacionadas al respecto. La clave para resolver este problema está en el método isLinked() en la clase AndroidAuthSession . Comparto mi código para que pueda resolver sus dudas.

 public class DropBoxInteractorImpl implements DropBoxInteractor { private DropboxAPI<AndroidAuthSession> mDropBoxApi; public DropBoxInteractorImpl(DropboxAPI<AndroidAuthSession> mDropBoxApi) { this.mDropBoxApi = mDropBoxApi; } @Override public void login(final Context context, final CloudServiceCallback cloudServiceCallback) { String accessToken = PrefUtils.getFromPrefs(context, KeysPref.DROPBOX_ACCESS_TOKEN, null); if (accessToken == null) { mDropBoxApi.getSession().startOAuth2Authentication(context); } else { mDropBoxApi.getSession().setOAuth2AccessToken(accessToken); } } @Override public void confirmLogin(Context context, final CloudServiceCallback cloudServiceCallback) { AndroidAuthSession session = mDropBoxApi.getSession(); if (session.authenticationSuccessful()) { // Required to complete auth, sets the access token on the session session.finishAuthentication(); String accessToken = mDropBoxApi.getSession().getOAuth2AccessToken(); PrefUtils.saveToPrefs(context, KeysPref.DROPBOX_ACCESS_TOKEN, accessToken); } if (session.isLinked()) { cloudServiceCallback.loginSuccessful(); } else { cloudServiceCallback.loginError(); Timber.e("There was a problem login in!!"); } } } 

Lo explicaré paso a paso.

  • En primer lugar, estoy usando Dagger como la inyección de dependencia, por eso tengo mi mDropBoxApi en el constructor, pero si no lo es, sólo crear la sesión siempre de la misma manera que estoy haciendo en este método.

     @Provides @Singleton public DropboxAPI<AndroidAuthSession> providesDropBoxService() { AppKeyPair appKeyPair = new AppKeyPair(Keys.DROPBOX_APP, Keys.DROPBOX_APP_SECRET); AndroidAuthSession session = new AndroidAuthSession(appKeyPair); return new DropboxAPI<AndroidAuthSession>(session); } 
  • Ahora que tienes tu objeto DropboxAPI, necesitas startOAuth2Authentication' or setOAuth2AccessToken` en caso de que ya lo tengas (guardado en la última sesión). Puede hacerlo en onCreate (si es una actividad) o en onActivityCreated si es un fragmento.

     @Override public void login(final Context context) { String accessToken = PrefUtils.getFromPrefs(context, KeysPref.DROPBOX_ACCESS_TOKEN, null); if (accessToken == null) { mDropBoxApi.getSession().startOAuth2Authentication(context); } else { mDropBoxApi.getSession().setOAuth2AccessToken(accessToken); } } 
  • Después de eso, en su método onResume (y aquí es donde vamos a resolver nuestro problema) verifica si el inicio de sesión ha sido exitoso llamando a la función session.authenticationSuccessful() . Esto devolverá verdadero SOLAMENTE en caso de que haya realizado el proceso de autenticación. Si no es nulo, el inicio de sesión no se ha realizado correctamente o su cuenta ya está enlazada. Eso es todo, enlazado. ¿Cómo lo compruebas? Bueno, como he dicho antes, es la clave para resolver este problema. Lo que hay que comprobar es si la sesión ya está vinculada llamada session.isLinked() y voilà. Se le dirá si está vinculado correctamente con la API de la caja de depósito o, en caso de que sea falso, hubo un problema en el proceso.

     @Override public void confirmLogin(Context context, final CloudServiceCallback callback) { AndroidAuthSession session = mDropBoxApi.getSession(); if (session.authenticationSuccessful()) { // Required to complete auth, sets the access token on the session session.finishAuthentication(); String accessToken = mDropBoxApi.getSession().getOAuth2AccessToken(); PrefUtils.saveToPrefs(context, KeysPref.DROPBOX_ACCESS_TOKEN, accessToken); } if (session.isLinked()) { callback.loginSuccessful(); } else { callback.loginError(); Timber.e("There was a problem login in!!"); } } 

Espero que esto le resuelva dudas sobre ello, y Si tiene alguna pregunta, por favor, no dude en preguntar.

El dropbox android JavaDoc parece ampliar lo que necesitas hacer un poco más, mostrando un constructor AndroidAuthSession alternativo:

Cuando un usuario vuelve a su aplicación y tiene fichas almacenadas, cree una nueva sesión con ellas:

 AndroidAuthSession session = new AndroidAuthSession( myAppKeys, myAccessType, new AccessTokenPair(storedAccessKey, storedAccessSecret)); 

Supongo que sólo tienes que instanciar un objeto DropboxAPI y eres bueno para ir sin la startAuthentication () … endAuthentication (), etc

 DropboxAPI<AndroidAuthSession> mDBApi = new DropboxAPI<AndroidAuthSession>(session); 

No he probado esto, pero es esencialmente lo mismo que Greg estaba diciendo.

Los ejemplos incluidos con el SDK muestran las diferentes formas en que puede crear una sesión con un token de acceso existente. Por ejemplo, utilizando el método setAccessTokenPair:

  // Load state. State state = State.load(STATE_FILE); // Connect to Dropbox. WebAuthSession session = new WebAuthSession(state.appKey, WebAuthSession.AccessType.APP_FOLDER); session.setAccessTokenPair(state.accessToken); DropboxAPI<?> client = new DropboxAPI<WebAuthSession>(session); 

O usar el constructor:

  WebAuthSession sourceSession = new WebAuthSession(state.appKey, Session.AccessType.DROPBOX, sourceAccess); DropboxAPI<?> sourceClient = new DropboxAPI<WebAuthSession>(sourceSession); 

(Estos ejemplos simples sólo cargan el token de acceso de un archivo de estado.)

  • Java.lang.NoClassDefFoundError: oauth.signpost.commonshttp.CommonsHttpOAuthConsumer android
  • Android Tumblr Oauth-signpost 401
  • Dev Android: la URL de devolución de llamada no funciona ... (0_o)
  • ¿Cómo implementar correctamente el inicio de sesión linkedIn?
  • ¿Cómo verificar correctamente la integridad de un token de Google?
  • Respaldo del navegador y actividad de Android
  • Android resto cliente a magento
  • ¿Cuáles son los riesgos de exponer la clave no tan secreta? ¿Hay alguna solución?
  • "Http: // {root_dir} / oauth / token" Archivo no encontrado en Magento para registrar la aplicación REST API
  • LinkedIn scribe OAuth biblioteca no puede permitir el acceso a la cuenta de LinkedIn
  • ¿Es OAuth en un teléfono móvil usando un servidor proxy demasiado problema?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.