4

Dropbox Web サイトの入門記事には、Android で Core API を使用して開始する方法のチュートリアルがあります。

アプリケーションを初めて起動すると、ユーザーは、ユーザーの Dropbox アカウントを使用するためにソフトウェアを認証するよう求められます。認証が正常に完了すると、キーとシークレットの認証文字列のペアを受け取ります。

ユーザーが自分の Dropbox アカウントを使用するためにアプリケーションを認証した後、Android の SharedPreferences を使用してキーとシークレットを保存します。

これらの保存された値を使用するにはどうすればよいですか? SharedPreferences を使用してそれらを取得する方法を意味するのではなく、これらを使用してアプリケーションを再認証する必要がないようにする方法を教えてください。Dropbox サイトでは、これらを使用する方法を提供していません。彼らが言うすべては

finishAuthentication() メソッドは、ユーザーのアクセス トークンをセッションにバインドします。mDBApi.getSession().getAccessTokenPair() を介してそれらを取得できるようになりました。

これらのトークンは、アプリを閉じた後に再び必要になるため、後でアクセスできるように保存しておくことが重要です (ただし、ここには示されていません)。そうしないと、ユーザーはアプリを使用するたびに再認証する必要があります。キーの保存を実装する一般的な方法は、Android の SharedPreferences API を使用することです。

4

3 に答える 3

6

私は同じ問題を抱えていました.ドキュメントは良くないので、それに関するいくつかの関連する質問を見ました. この問題を解決する鍵は、クラス内のメソッドisLinked()にあります。AndroidAuthSessionコードを共有するので、疑問が解決するかもしれません。

public class DropBoxInteractorImpl implements DropBoxInteractor {
    private DropboxAPI<AndroidAuthSession> mDropBoxApi;

    public DropBoxInteractorImpl(DropboxAPI<AndroidAuthSession> mDropBoxApi) {
        this.mDropBoxApi = mDropBoxApi;
    }

    @Override
    public void login(final Context context, final CloudServiceCallback cloudServiceCallback) {
        String accessToken = PrefUtils.getFromPrefs(context, KeysPref.DROPBOX_ACCESS_TOKEN, null);
        if (accessToken == null) {
            mDropBoxApi.getSession().startOAuth2Authentication(context);
        } else {
            mDropBoxApi.getSession().setOAuth2AccessToken(accessToken);
        }
    }

    @Override
    public void confirmLogin(Context context, final CloudServiceCallback cloudServiceCallback) {
        AndroidAuthSession session = mDropBoxApi.getSession();
        if (session.authenticationSuccessful()) {
            // Required to complete auth, sets the access token on the session
            session.finishAuthentication();
            String accessToken = mDropBoxApi.getSession().getOAuth2AccessToken();
            PrefUtils.saveToPrefs(context, KeysPref.DROPBOX_ACCESS_TOKEN, accessToken);
        }

        if (session.isLinked()) {
            cloudServiceCallback.loginSuccessful();
        } else {
            cloudServiceCallback.loginError();
            Timber.e("There was a problem login in!!");
        }
    }
}

順を追って説明します。

  • まず、Dagger を依存性注入として使用しているため、コンストラクターで mDropBoxApi を取得しますが、そうでない場合は、このメソッドで行っているのと同じ方法でセッションを常に作成してください。

    @Provides
    @Singleton
    public DropboxAPI<AndroidAuthSession> providesDropBoxService() {
        AppKeyPair appKeyPair = new AppKeyPair(Keys.DROPBOX_APP, Keys.DROPBOX_APP_SECRET);
        AndroidAuthSession session = new AndroidAuthSession(appKeyPair);
        return new DropboxAPI<AndroidAuthSession>(session);
    }
    
  • DropboxAPI オブジェクトをstartOAuth2Authentication' or取得したので、すでにある場合は setOAuth2AccessToken` を実行する必要があります (最後のセッションから保存されています)。これは、onCreate (アクティビティの場合) または onActivityCreated (フラグメントの場合) で行うことができます。

    @Override
    public void login(final Context context) {
        String accessToken = PrefUtils.getFromPrefs(context, KeysPref.DROPBOX_ACCESS_TOKEN, null);
        if (accessToken == null) {
            mDropBoxApi.getSession().startOAuth2Authentication(context);
        } else {
            mDropBoxApi.getSession().setOAuth2AccessToken(accessToken);
        }
    }
    
  • その後、 onResume メソッド (ここで問題を解決します) で、関数を呼び出してログインが成功したかどうかを確認しますsession.authenticationSuccessful()。これは、認証プロセスを行った場合にのみ true を返します。null でない場合は、ログインに失敗したか、アカウントが既にリンクされています。以上、リンク済み。どうやってそれを確認しますか?前にも言ったように、それがこの問題を解決する鍵です。確認する必要があるのは、セッションが既にリンクされた呼び出しであるかどうかですsession.isLinked()。ドロップボックス API とのリンクに成功したかどうか、または false の場合はプロセスに問題があったことを示します。

    @Override
    public void confirmLogin(Context context, final CloudServiceCallback callback) {
        AndroidAuthSession session = mDropBoxApi.getSession();
        if (session.authenticationSuccessful()) {
            // Required to complete auth, sets the access token on the session
            session.finishAuthentication();
            String accessToken = mDropBoxApi.getSession().getOAuth2AccessToken();
            PrefUtils.saveToPrefs(context, KeysPref.DROPBOX_ACCESS_TOKEN, accessToken);
        }
    
        if (session.isLinked()) {
            callback.loginSuccessful();
        } else {
            callback.loginError();
            Timber.e("There was a problem login in!!");
        }
    }
    

これで疑問が解決することを願っています。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2014-08-30T14:03:22.737 に答える
3

ドロップボックス android JavaDoc は、代替の AndroidAuthSession コンストラクターを示して、もう少し行う必要があることを拡張しているようです。

ユーザーがアプリに戻り、トークンが保存されたら、新しいセッションを作成するだけです。

AndroidAuthSession session = new AndroidAuthSession(
     myAppKeys, myAccessType, new AccessTokenPair(storedAccessKey, storedAccessSecret));

その場合は、DropboxAPI オブジェクトをインスタンス化するだけでよいので、startAuthentication()... endAuthentication() などを使用しなくても問題ないと思います。

DropboxAPI<AndroidAuthSession> mDBApi = new DropboxAPI<AndroidAuthSession>(session);

私はこれを試したことはありませんが、基本的にはグレッグが言っていたことと同じです。

于 2014-01-03T23:44:59.923 に答える
2

SDK に含まれるサンプルは、既存のアクセス トークンを使用してセッションを作成するさまざまな方法を示しています。たとえば、setAccessTokenPair メソッドを使用すると、次のようになります。

    // Load state.
    State state = State.load(STATE_FILE);

    // Connect to Dropbox.
    WebAuthSession session = new WebAuthSession(state.appKey, WebAuthSession.AccessType.APP_FOLDER);
    session.setAccessTokenPair(state.accessToken);
    DropboxAPI<?> client = new DropboxAPI<WebAuthSession>(session);

またはコンストラクターを使用します。

    WebAuthSession sourceSession = new WebAuthSession(state.appKey, Session.AccessType.DROPBOX, sourceAccess);
    DropboxAPI<?> sourceClient = new DropboxAPI<WebAuthSession>(sourceSession);

(これらの簡単な例では、状態ファイルからアクセス トークンをロードするだけです。)

于 2013-07-05T17:30:18.020 に答える