使用Android上保存的Dropbox身份validation详细信息

在Dropbox网站上的入门文章中,他们有一个教程如何使用Android API和Android入门。

当应用程序首次启动时,系统会要求用户对软件进行身份validation以使用用户Dropbox帐户。 身份validation成功完成后,您将收到一对身份validation字符串,密钥和密码。

用户validation应用程序使用他或她的Dropbox帐户后,我使用Android的SharedPreferences保存密钥和secred。

如何使用这些保存的值? 我不是指如何使用SharedPreferences检索它们,而是如何使用它们来防止再次重新validation应用程序的需要? 在Dropbox网站上,他们没有提供使用这些的方法。 他们所说的都是

finishAuthentication()方法将用户的访问令牌绑定到会话。 您现在可以通过mDBApi.getSession()。getAccessTokenPair()来检索它们。

在您的应用关闭后,您将再次需要这些令牌,因此保存它们以供将来访问非常重要(尽管此处未显示)。 如果不这样做,用户每次使用您的应用时都必须重新进行身份validation。 实现存储密钥的常用方法是通过Android的SharedPreferences API。

我有同样的问题,文档不是很好所以我看到了几个相关的问题。 解决此问题的关键是AndroidAuthSession类中的方法isLinked() 。 我分享我的代码所以它可以解决你的疑虑。

 public class DropBoxInteractorImpl implements DropBoxInteractor { private DropboxAPI mDropBoxApi; public DropBoxInteractorImpl(DropboxAPI 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!!"); } } } 

我会一步一步解释。

  • 首先,我使用Dagger作为dependency injection,这就是我在构造函数中获取mDropBoxApi的原因,但如果不是,只需创建会话,就像我在此方法中所做的一样。

     @Provides @Singleton public DropboxAPI providesDropBoxService() { AppKeyPair appKeyPair = new AppKeyPair(Keys.DROPBOX_APP, Keys.DROPBOX_APP_SECRET); AndroidAuthSession session = new AndroidAuthSession(appKeyPair); return new DropboxAPI(session); } 
  • 现在你有了DropboxAPI对象,你需要startOAuth2Authentication' or setOAuth2AccessToken`以防你已经拥有它(从最后一个会话中保存)。 你可以在onCreate(如果它是一个活动)或onActivityCreated(如果它是片段)中执行此操作。

     @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); } } 
  • 在那之后,在你的onResume方法中(这里我们将解决我们的问题)你检查登录是否成功调用函数session.authenticationSuccessful() 。 只有在您执行身份validation过程时,才会返回true。 如果它不为空,则登录失败或您的帐户已经LINKED。 就是这样,LINKED。 你怎么检查? 正如我之前所说,这是解决这个问题的关键。 你需要检查的是会话是否已经链接调用session.isLinked()和voilà。 它会告诉您是否已成功链接到dropbox api,或者如果它是错误的,则该过程中存在问题。

     @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!!"); } } 

我希望这能解决你的疑问,如果你有任何疑问,请不要犹豫。

Dropbox android JavaDoc似乎扩展了你需要做的更多一点,展示了另一个AndroidAuthSession构造函数:

当用户返回您的应用并且您已存储令牌时,只需与他们创建一个新会话:

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

我想你只需要实例化一个DropboxAPI对象,你就可以不使用startAuthentication()… endAuthentication()等。

 DropboxAPI mDBApi = new DropboxAPI(session); 

我没有试过这个,但这与格雷格所说的基本相同。

SDK附带的示例显示了使用现有访问令牌创建会话的不同方法。 例如,使用方法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(session); 

或者使用构造函数:

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

(这些简单的示例只是从状态文件加载访问令牌。)