首页 文章

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

提问于
浏览
4

在Dropbox网站的Getting started文章中,他们有一个教程如何使用Android API和Android入门 .

当应用程序首次启动时,系统会要求用户对软件进行身份验证以使用用户Dropbox帐户 . 验证成功完成后,您将收到一对验证字符串,密钥和密码 .

在用户验证应用程序以使用他或她的Dropbox帐户后,我使用Android的SharedPreferences保存密钥和secred .

如何使用这些保存的值?我不是指如何使用SharedPreferences检索它们,而是如何使用它们来防止再次重新验证应用程序的需要?在Dropbox网站上,他们没有提供使用这些的方法 . 他们所说的都是

finishAuthentication()方法将用户的访问令牌绑定到会话 . 您现在可以通过mDBApi.getSession() . getAccessTokenPair()来检索它们 . 您的应用关闭后,您将再次需要这些令牌,因此保存它们以供将来访问非常重要(尽管此处未显示) . 如果不这样做,则用户每次使用您的应用时都必须重新进行身份验证 . 实现存储密钥的常用方法是通过Android的SharedPreferences API .

3 回答

  • 3

    我有同样的问题,文档不是很好所以我看到了几个相关的问题 . 解决此问题的关键是 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!!");
            }
        }
    }
    

    我会一步一步解释 .

    • 首先,我使用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 . 如果它不为空,则登录失败或您的帐户已经链接 . 就是这样,LINKED . 你怎么检查?正如我之前所说,这是解决这个问题的关键 . 你需要检查的是会话是否已经链接调用 session.isLinked() 和voilà . 它会告诉您是否已成功链接到dropbox api,或者如果它是错误的,则该过程中存在问题 .
    @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!!");
        }
    }
    

    我希望这能解决你的疑问,如果你有任何疑问,请不要犹豫 .

  • 2

    Dropbox android JavaDoc似乎扩展了你需要做的更多一点,展示了另一个AndroidAuthSession构造函数:

    当用户返回您的应用并且您已存储令牌时,只需与他们创建一个新会话:

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

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

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

    我没有试过这个,但这与格雷格所说的基本相同 .

  • 6

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

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

相关问题