我需要验证多个帐户
我搜索了论坛,似乎有可能 所以我尝试了一下,但我失败了
我曾尝试使用相同的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>
答案 0 :(得分:1)
我不确定这是否会对您的用例有所帮助,但也许可以通过编写自己的身份验证器来使用Android内置帐户管理来分离身份验证过程。 以下是一个示例:http://udinic.wordpress.com/2013/04/24/write-your-own-android-authenticator/
答案 1 :(得分:1)
我遇到了类似的要求,这就是我的工作方式。
第一个应用
使用普通的Dropbox流程访问您的第一个应用程序。
注意:强> 2个Dropbox应用程序要求的一个可能情况是使用不同的Dropbox应用程序从您的服务器访问用户帐户。请注意,您可以与服务器共享第一个应用程序的访问令牌,并安全地重复使用这些凭据,前提是您在服务器上使用相同的Dropbox应用程序。如果你不能忍受,继续阅读。
第二个应用
选项1:使用其他Android应用
一些提示,如果您打算使用它:
选项2 :如果您只使用一个Android应用程序继续执行此操作,我找到了可能的解决方法,如下所述。
如果您要在服务器端上下文中使用第二个应用程序,只需与您的服务器共享授权代码即可。您可以在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,它存储上次身份验证的结果,并且可能会产生问题,因为这是静态变量。
您应该可以根据需要进行多次登录。