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

別のものを追加する際にマニフェストに何かを追加する必要があるかもしれないことに気付きましたが、重複したエラーが発生するため、別のアプリキーを使用して Android マニフェストに 2 番目のアクティビティを追加することはできません。

<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

私は同様の要件に遭遇しましたが、これが私が回避した方法です。


最初のアプリ 通常のドロップボックス フローを使用して、最初のアプリにアクセスします

注: 2 つのドロップボックス アプリケーションの要件の可能性が高いのは、別のドロップボックス アプリケーションを使用してサーバーからユーザー アカウントにアクセスすることです。サーバーで同じドロップボックス アプリケーションを使用している場合、最初のアプリからのアクセス トークンをサーバーと共有し、これらの資格情報を安全に再利用できることに注意してください。それに耐えられない場合は、読み続けてください。

2 つ目のアプリ
オプション 1:別の Android アプリを使用する

  1. 2 つ目のドロップボックス アプリの oAuth フロー専用に、別の Android アプリを作成します。
  2. Intent を使用して、app1 から app2 で oAuthflow をトリガーします。
  3. ここでも、インテントを使用してトークン データを app2 から app1 に送り返します。

これを使用する場合のヒント:

  1. App2 oAuth アクティビティの背景を透明にする
  2. app1 <-> app2 トランジションのインテント変更アニメーションを削除
  3. App2 アクティビティの onCreate で oAuth をトリガーする

オプション 2: Android アプリを 1 つだけ使用してこれを続けている場合は、以下で説明する回避策を見つけました。

  1. ユーザーに次の URL を開くように促します: https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id=APP2_CLIENT_ID
  2. Dropbox から返された認証コードをコピーして戻す必要があります。
  3. この認証コードを使用して、2 つ目のアプリの access_tokens を取得できます

サーバー側のコンテキストで 2 番目のアプリを使用する場合は、認証コードをサーバーと共有するだけです。次のように、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 に答える