Android Dropbox API - 成功验证后无法保存用户令牌

时间:2014-08-22 12:58:58

标签: android dropbox-api

我正在尝试将Android 4+连接到Dropbox。我使用的是Dropbox提供的最新版Core API。

在我使用dropboxAPI.getSession().startOAuth2Authentication(activity)对用户进行身份验证后,当用户返回我的应用时,尝试保存用户密钥和令牌,一切正常。

当用户在身份验证后返回我的应用程序时,以下代码应该保存密钥和令牌:

public boolean completeLogInAfterAuthentication() {
    AndroidAuthSession session = dropboxAPI.getSession();
    if (session.authenticationSuccessful()) {
        try {
            // Mandatory call to complete the auth
            session.finishAuthentication();

            // Store it locally in our app for later use
            TokenPair tokens = session.getAccessTokenPair();
            saveSessionKeys(tokens.key, tokens.secret);
            return true;
        } catch (IllegalStateExceptione) {
            Log.d("MyLog", "Couldn't authenticate with Dropbox:" + e.getLocalizedMessage());
            Log.d("MyLog", "Error authenticating", e);
        }
    }
    return false;
}

这正是Dropbox提供的DBRoulett演示中使用的代码。 问题是,session.getAccessTokenPair()返回null

因此我无法存储任何密钥或令牌,用户每次启动应用程序时都必须重新登录。我该如何解决这个问题?

我发现的所有信息都说getAccessTokenPair()可能会因IllegalStateException而失败,但事实并非如此。返回null的情况不会在任何地方描述。知道我能做什么吗?

1 个答案:

答案 0 :(得分:3)

getAccessTokenPair用于获取OAuth 1访问令牌(和机密)。但您使用的是OAuth 2,因此您需要getOAuth2AccessToken。从教程(https://www.dropbox.com/developers/core/start/android):

protected void onResume() {
    super.onResume();

    if (mDBApi.getSession().authenticationSuccessful()) {
        try {
            // Required to complete auth, sets the access token on the session
            mDBApi.getSession().finishAuthentication();

            String accessToken = mDBApi.getSession().getOAuth2AccessToken();
        } catch (IllegalStateException e) {
            Log.i("DbAuthLog", "Error authenticating", e);
        }
    }
}

这与DBRoulette示例中的内容大致相同,但它包含OAuth 1和OAuth 2的代码:

private void storeAuth(AndroidAuthSession session) {
    // Store the OAuth 2 access token, if there is one.
    String oauth2AccessToken = session.getOAuth2AccessToken();
    if (oauth2AccessToken != null) {
        SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
        Editor edit = prefs.edit();
        edit.putString(ACCESS_KEY_NAME, "oauth2:");
        edit.putString(ACCESS_SECRET_NAME, oauth2AccessToken);
        edit.commit();
        return;
    }
    // Store the OAuth 1 access token, if there is one.  This is only necessary if
    // you're still using OAuth 1.
    AccessTokenPair oauth1AccessToken = session.getAccessTokenPair();
    if (oauth1AccessToken != null) {
        SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
        Editor edit = prefs.edit();
        edit.putString(ACCESS_KEY_NAME, oauth1AccessToken.key);
        edit.putString(ACCESS_SECRET_NAME, oauth1AccessToken.secret);
        edit.commit();
        return;
    }
}