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

标签 java android oauth dropbox dropbox-api

Getting started Dropbox 网站上的文章他们有一个教程如何在 Android 中使用 Core API 来开始。

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

在用户对应用程序进行身份验证以使用他或她的 Dropbox 帐户后,我使用 Android 的 SharedPreferences 保存 key 和密码。

如何使用这些保存的值?我的意思不是我如何使用 SharedPreferences 检索它们,而是我如何使用它们来防止再次重新验证应用程序的需要?在 Dropbox 站点上,他们不提供使用这些的方法。他们只说

The finishAuthentication() method will bind the user's access tokens to the session. You'll now be able to retrieve them via mDBApi.getSession().getAccessTokenPair().

You'll need these tokens again after your app closes, so it's important to save them for future access (though it's not shown here). If you don't, the user will have to re-authenticate every time they use your app. A common way to implement storing keys is through Android's SharedPreferences API.

最佳答案

我有同样的问题,文档不是很好,所以我看到了几个相关的问题。 解决这个问题的关键在于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 作为依赖项注入(inject),这就是我在构造函数中获取 mDropBoxApi 的原因,但如果您不是,只需始终按照我在此方法中所做的相同方式创建 session 。

    @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' 或 setOAuth2AccessToken`,以防您已经拥有它(从上次 session 保存)。您可以在 onCreate(如果它是一个 Activity )或在 onActivityCreated(如果它是一个 fragment )中执行此操作。

    @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。如果它不为空,则登录不成功或您的帐户已被链接。就是这样,链接。你如何检查?正如我之前所说,这是解决这个问题的关键。您需要检查的是 session 是否已链接调用 session.isLinked() 并瞧瞧。它会告诉您是否已成功链接到 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!!");
        }
    }
    

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

关于java - 在 Android 上使用保存的 Dropbox 身份验证详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17484389/

相关文章:

api - Linkedin OAuth pictureUrl 导致 500 错误

Java, "a[1] *= a[1] = b[n + 1]"没有按预期工作?

java - 如何在 Android 的 xml 中为字符串资源指定空值?

java - JSP 请求调度

android - 没有为我的微调器调用 OnItemSelectedListener()

android - 编辑/删除谷歌日历事件并获取事件 ID

java - Android 模拟器无法启动或启动。什么都没有弹出

servlets - 如何获取通过 OAuth io 记录的当前用户详细信息

java - 寻找一种重新运行类静态初始化器的方法

javascript - 用于获取推文列表的 Twitter API 1.1