在Dropbox网站上的Getting started文章中,他们有一个如何使用Android API开始使用的教程。
当应用程序首次启动时,系统会要求用户对软件进行身份验证以使用用户Dropbox帐户。验证成功完成后,您将收到一对验证字符串,密钥和密码。
在用户验证应用程序使用他或她的Dropbox帐户后,我使用Android的SharedPreferences保存密钥和secred。
如何使用这些保存的值?我不是指如何使用SharedPreferences检索它们,而是如何使用它们来防止再次重新验证应用程序的需要?在Dropbox网站上,他们没有提供使用这些的方法。他们所说的只是
finishAuthentication()方法将绑定用户的访问令牌 到会议。您现在可以通过它来检索它们 mDBApi.getSession()。getAccessTokenPair()。
您的应用关闭后,您将再次需要这些令牌,所以就是这样 保存它们以供将来访问很重要(虽然这里没有显示)。 如果不这样做,用户每次都必须重新进行身份验证 使用你的应用。实现存储密钥的常用方法是通过 Android的SharedPreferences API。
答案 0 :(得分: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。如果它不为空,则登录失败或您的帐户已经链接。就是这样,LINKED。你怎么检查?正如我之前所说,这是解决这个问题的关键。您需要检查的是会话是否已经链接呼叫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!!");
}
}
我希望这能解决你的疑问,如果你有任何疑问,请不要犹豫。
答案 1 :(得分:3)
dropbox android JavaDoc似乎扩展了你需要做的更多一点,展示了另一个AndroidAuthSession构造函数:
当用户返回您的应用并且您已存储令牌时,只需与他们创建一个新会话:
AndroidAuthSession session = new AndroidAuthSession(
myAppKeys, myAccessType, new AccessTokenPair(storedAccessKey, storedAccessSecret));
我想你只需要实例化一个DropboxAPI对象,你就可以不使用startAuthentication()... endAuthentication()等。
DropboxAPI<AndroidAuthSession> mDBApi = new DropboxAPI<AndroidAuthSession>(session);
我没有尝试过,但这与Greg所说的基本相同。
答案 2 :(得分: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);
(这些简单示例只是从状态文件加载访问令牌。)