4

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

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

在用户验证应用程序以使用他或她的 Dropbox 帐户后,我使用 Android 的 SharedPreferences 保存密钥和加密。

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

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

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

4

3 回答 3

6

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

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

我将逐步解释它。

  • 首先,我使用 Dagger 作为依赖注入,这就是我在构造函数中获取 mDropBoxApi 的原因,但如果不是,只需始终以与我在此方法中相同的方式创建会话。

    @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);
    }
    
  • 现在您已经有了 DropboxAPI 对象,您需要startOAuth2Authentication' orsetOAuth2AccessToken` 以防您已经拥有它(从上次会话中保存)。您可以在 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()。仅在您执行身份验证过程时才会返回 true。如果它不为 null,则说明登录不成功或您的帐户已链接。就是这样,链接。你怎么检查?正如我之前所说,它是解决这个问题的关键。您需要检查的是会话是否已经链接呼叫session.isLinked()和瞧。它会告诉您是否已成功链接到 dropbox api,或者如果链接为 false,则说明过程中存在问题。

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

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

于 2014-08-30T14:03:22.737 回答
3

Dropbox android JavaDoc 似乎扩展了您需要做的更多工作,显示了一个替代的 AndroidAuthSession 构造函数:

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

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

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

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

我还没有尝试过,但这与 Greg 所说的基本相同。

于 2014-01-03T23:44:59.923 回答
2

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<WebAuthSession>(session);

或者使用构造函数:

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

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

于 2013-07-05T17:30:18.020 回答