9

我需要验证多个帐户

搜了一下论坛,好像可以,所以试了一下,失败了

我曾尝试使用相同的 API APP_KEY 和 APP_SECRET,但失败了我的两个会话都返回相同的访问令牌对

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

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

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

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

onCreate (安卓)

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

onResume (安卓)

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;
}
}

我注意到我可能需要在添加另一个时在清单中添加一些东西但是我不能在具有不同 APP KEY 的 android 清单中添加第二个活动,因为它会导致重复错误我该怎么做?

<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> 
4

3 回答 3

1

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

于 2014-05-20T16:57:33.310 回答
1

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


一个应用程序使用正常的 Dropbox 流程访问您的第一个应用程序。

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

第二个应用
选项 1:使用另一个 Android 应用

  1. 为第二个保管箱应用程序的 oAuth 流程创建另一个 Android 应用程序。
  2. 使用 Intent 从 app1 触发 app2 中的 oAuthflow。
  3. 同样,使用意图将令牌数据从 app2 发送回 app1

一些提示,如果你要使用这个:

  1. 使 App2 oAuth Activity 的背景透明
  2. 删除 app1 <-> app2 转换的 Intent 更改动画
  3. 在 App2 Activity 的 onCreate 中触发 oAuth

选项 2:如果您只使用一个 Android 应用程序继续执行此操作,我找到了一种可能的解决方法,如下所述。

  1. 提示您的用户打开此网址: https ://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id=APP2_CLIENT_ID
  2. 他们必须复制 Dropbox 返回的授权码
  3. 此授权码可用于获取第二个应用的 access_tokens

如果您要在服务器端上下文中使用第二个应用程序,只需与您的服务器共享授权代码。您可以在 python 流程中从授权代码中获取令牌,如下所示:

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

有关从授权密钥获取 access_tokens 的更通用方法,请查看此

于 2015-01-28T01:32:44.423 回答
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 ,它存储上次身份验证的结果,并且可能会产生问题,因为这是静态变量。

您现在应该可以进行尽可能多的登录。

于 2015-09-03T17:54:36.090 回答