如何在Android dropbox sdk 1.5.1中验证多个帐户?

时间:2012-11-20 18:03:22

标签: android dropbox dropbox-api

我需要验证多个帐户

我搜索了论坛,似乎有可能 所以我尝试了一下,但我失败了

我曾尝试使用相同的API APP_KEY& APP_SECRET,它失败了 我的会话都返回相同的访问权限对

所以我尝试使用不同的API APP_KEY& APP_SECRET,在相同的Dropbox帐户下,它也失败了

所以我再次尝试使用不同的API APP_KEY&来自不同Dropbox帐户的APP_SECRET,它仍然失败

任何人都可以为我提供解决方案吗?提前致谢

下面是我的代码,主要来自DBroulette示例

onCreate(android)

AndroidAuthSession session = buildSession();
mApi = new DropboxAPI<AndroidAuthSession>(session);
AndroidAuthSession session2 = buildSession2();
mApi2 = new DropboxAPI<AndroidAuthSession>(session2);

onResume(android)

AndroidAuthSession session = mApi.getSession();
if (session.isLinked()) {
dbsetLoggedIn(true);
} else {
dbsetLoggedIn(false);
}
if (session.authenticationSuccessful()) {
try {
session.finishAuthentication();
TokenPair tokens = session.getAccessTokenPair();
dbstoreKeys(tokens.key, tokens.secret);
dbsetLoggedIn(true);
statusTv.append("Dropbox authentication successful\n");
} catch (IllegalStateException e) {
Log.i("Dropbox Error", "Error authenticating", e);
}
}

AndroidAuthSession session2 = mApi2.getSession();
if (session2.isLinked()) {
dbsetLoggedIn2(true);
} else {
dbsetLoggedIn2(false);
}
if (session2.authenticationSuccessful()) {
try {
session2.finishAuthentication();
TokenPair tokens = session2.getAccessTokenPair();
dbstoreKeys2(tokens.key, tokens.secret);
dbsetLoggedIn2(true);
statusTv.append("2Dropbox authentication successful\n");
} catch (IllegalStateException e) {
Log.i("Dropbox Error", "Error authenticating", e);
}
}

其他代码

private AndroidAuthSession buildSession() {
AppKeyPair appKeyPair = new AppKeyPair(Constants.APP_KEY, Constants.APP_SECRET);
AndroidAuthSession session;
String[] stored = getKeys();
if (stored != null) {
AccessTokenPair accessToken = new AccessTokenPair(stored[0], stored[1]);
session = new AndroidAuthSession(appKeyPair, Constants.ACCESS_TYPE, accessToken);
} else {
session = new AndroidAuthSession(appKeyPair, Constants.ACCESS_TYPE);
}
return session;
}

private AndroidAuthSession buildSession2() {
AppKeyPair appKeyPair = new AppKeyPair(Constants.APP_KEY2, Constants.APP_SECRET2);
AndroidAuthSession session;
String[] stored = getKeys2();
if (stored != null) {
AccessTokenPair accessToken = new AccessTokenPair(stored[0], stored[1]);
session = new AndroidAuthSession(appKeyPair, Constants.ACCESS_TYPE, accessToken);
} else {
session = new AndroidAuthSession(appKeyPair, Constants.ACCESS_TYPE);
}
return session;
}

private String[] getKeys() {
SharedPreferences prefs = getSharedPreferences(Constants.ACCOUNT_PREFS_NAME, 0);
String key = prefs.getString(Constants.ACCESS_KEY_NAME, null);
String secret = prefs.getString(Constants.ACCESS_SECRET_NAME, null);
if (key != null && secret != null) {
String[] ret = new String[2];
ret[0] = key;
ret[1] = secret;
return ret;
} else {
return null;
}
}

private String[] getKeys2() {
SharedPreferences prefs = getSharedPreferences(Constants.ACCOUNT_PREFS_NAME, 0);
String key = prefs.getString(Constants.ACCESS_KEY_NAME2, null);
String secret = prefs.getString(Constants.ACCESS_SECRET_NAME2, null);
if (key != null && secret != null) {
String[] ret = new String[2];
ret[0] = key;
ret[1] = secret;
return ret;
} else {
return null;
}
}

我注意到我可能需要在添加另一个中添加一些内容 但我无法在Android清单中添加不同APP KEY的第二个活动,因为它会导致重复错误 我该怎么办?

<activity
android:name="com.dropbox.client2.android.AuthActivity"
android:configChanges="orientation|keyboard"
android:launchMode="singleTask" >
<intent-filter>
<data android:scheme="db-XXXXXXXXXXXX" />

<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity> 

3 个答案:

答案 0 :(得分:1)

我不确定这是否会对您的用例有所帮助,但也许可以通过编写自己的身份验证器来使用Android内置帐户管理来分离身份验证过程。 以下是一个示例:http://udinic.wordpress.com/2013/04/24/write-your-own-android-authenticator/

答案 1 :(得分:1)

我遇到了类似的要求,这就是我的工作方式。

第一个应用
使用普通的Dropbox流程访问您的第一个应用程序。

注意: 2个Dropbox应用程序要求的一个可能情况是使用不同的Dropbox应用程序从您的服务器访问用户帐户。请注意,您可以与服务器共享第一个应用程序的访问令牌,并安全地重复使用这些凭据,前提是您在服务器上使用相同的Dropbox应用程序。如果你不能忍受,继续阅读。

第二个应用
选项1:使用其他Android应用

  1. 为第二个Dropbox应用程序的oAuth流程创建另一个Android应用程序。
  2. 使用Intent从app1触发app2中的oAuthflow。
  3. 再次,使用intent将令牌数据从app2发送回app1
  4. 一些提示,如果您打算使用它:

    1. 使App2 oAuth活动的背景透明
    2. 删除app1&lt; - &gt;的意图更改动画app2过渡
    3. 在App2活动中触发oAuth&#39; onCreate
    4. 选项2 :如果您只使用一个Android应用程序继续执行此操作,我找到了可能的解决方法,如下所述。

      1. 提示您的用户打开此网址: https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id=APP2_CLIENT_ID
      2. 他们必须复制Dropbox返回的授权码
      3. 此授权码可用于获取第二个应用的access_tokens
      4. 如果您要在服务器端上下文中使用第二个应用程序,只需与您的服务器共享授权代码即可。您可以在python流中从授权代码中获取令牌,如下所示:

        flow = client.DropboxOAuth2FlowNoRedirect(app2_key, app2_secret)
        authorize_url = flow.start()
        access_token, user_id = flow.finish(auth_code_from_client)
        

        有关从授权密钥look at this

        获取access_tokens的更通用方法

答案 2 :(得分:0)

Dropbox API遇到了一些问题,或者你可以说一个技巧,你需要使用它才能进行多次登录。

<强> 1。将sAuthenticatedUid声明为String []

private static final String[] sAuthenticatedUid = { "dummy"}; // Keeping only one Auth Id to keep last authenticated item

<强> 2。使用不同的方法启动OAuth

使用session.startOAuth2Authentication(act, "", sAuthenticatedUid)进行身份验证,而不是使用startOAuth2Authentication()

第3。在身份验证成功时维护变量

sAuthenticatedUid[0] = sessionApi.getSession().finishAuthentication();  // Save the last successful UID
String oauth2AccessToken = sessionApi.getSession().getOAuth2AccessToken();
AuthActivity.result = null;  // Reset this so that we can login again, call only after finishAuthentication() 

AuthActivity是com.dropbox.client2.android.AuthActivity,它存储上次身份验证的结果,并且可能会产生问题,因为这是静态变量。

您应该可以根据需要进行多次登录。