Java 在Android上使用保存的Dropbox身份验证详细信息

Java 在Android上使用保存的Dropbox身份验证详细信息,java,android,oauth,dropbox,dropbox-api,Java,Android,Oauth,Dropbox,Dropbox Api,在Dropbox网站上的文章中,他们有一个教程,指导如何在Android上使用核心API 当应用程序第一次启动时,要求用户验证软件以使用用户Dropbox帐户。身份验证成功完成后,您将收到一对身份验证字符串、密钥和密钥 在用户验证应用程序使用其Dropbox帐户后,我使用Android的SharedReferences保存密钥和secred 如何使用这些保存的值?我不是指如何使用SharedReference检索它们,而是指如何使用它们来防止再次验证应用程序?在Dropbox网站上,他们没有提供

在Dropbox网站上的文章中,他们有一个教程,指导如何在Android上使用核心API

当应用程序第一次启动时,要求用户验证软件以使用用户Dropbox帐户。身份验证成功完成后,您将收到一对身份验证字符串、密钥和密钥

在用户验证应用程序使用其Dropbox帐户后,我使用Android的SharedReferences保存密钥和secred

如何使用这些保存的值?我不是指如何使用SharedReference检索它们,而是指如何使用它们来防止再次验证应用程序?在Dropbox网站上,他们没有提供使用这些功能的方法。他们只说

finishAuthentication()方法将绑定用户的访问令牌 出席会议。您现在可以通过 mDBApi.getSession().getAccessTokenPair()

在应用程序关闭后,您将再次需要这些令牌,因此 保存它们以备将来访问很重要(尽管此处未显示)。 如果不这样做,用户将不得不在每次访问时重新进行身份验证 使用你的应用程序。实现存储密钥的一种常见方法是 Android的SharedReferences API


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);
//加载状态。
State=State.load(State\u文件);
//连接到Dropbox。
WebAuthSession会话=新建WebAuthSession(state.appKey,WebAuthSession.AccessType.APP_文件夹);
setAccessTokenPair(state.accessToken);
DropboxAPI客户端=新的DropboxAPI(会话);
或使用构造函数:

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

(这些简单的示例只是从状态文件加载访问令牌。)

dropbox android JavaDoc似乎进一步扩展了您需要做的事情,显示了另一个AndroidAuthSession构造函数:

    WebAuthSession sourceSession = new WebAuthSession(state.appKey, Session.AccessType.DROPBOX, sourceAccess);
    DropboxAPI<?> sourceClient = new DropboxAPI<WebAuthSession>(sourceSession);
当用户返回到您的应用程序并且您存储了令牌时,只需使用它们创建一个新会话:

我想你只需要实例化一个DropboxAPI对象,就可以不用startAuthentication()了。。。endAuthentication()等

DropboxAPI mDBApi=新的DropboxAPI(会话);

我没有尝试过这个,但基本上和Greg说的是一样的。

我也有同样的问题,文档不是很好,所以我看到了几个相关的问题。 解决此问题的关键在于
AndroidAuthSession
类中的方法
isLinked()
。我分享我的代码,这样可以解决你的疑问

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!!");
        }
    }
}
  • 之后,在onResume方法中(我们将在这里解决问题),检查登录是否成功调用函数
    session.authenticationSuccessful()
    。只有在执行身份验证过程时,才会返回true。如果不为空,则说明登录不成功或您的帐户已链接。就这样,林克。你怎么检查?正如我之前所说,这是解决这个问题的关键。您需要检查的是会话是否已经链接到调用
    session.isLinked()
    和voilá。它将告诉您是否成功链接到dropbox 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!!");
        }
    }
    
  • 我希望这能解决你的疑问,如果你有任何问题,请不要犹豫

    @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);
    }
    
    @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);
        }
    }
    
    @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!!");
        }
    }