Java 在Android上使用保存的Dropbox身份验证详细信息
在Dropbox网站上的文章中,他们有一个教程,指导如何在Android上使用核心API 当应用程序第一次启动时,要求用户验证软件以使用用户Dropbox帐户。身份验证成功完成后,您将收到一对身份验证字符串、密钥和密钥 在用户验证应用程序使用其Dropbox帐户后,我使用Android的SharedReferences保存密钥和secred 如何使用这些保存的值?我不是指如何使用SharedReference检索它们,而是指如何使用它们来防止再次验证应用程序?在Dropbox网站上,他们没有提供使用这些功能的方法。他们只说 finishAuthentication()方法将绑定用户的访问令牌 出席会议。您现在可以通过 mDBApi.getSession().getAccessTokenPair() 在应用程序关闭后,您将再次需要这些令牌,因此 保存它们以备将来访问很重要(尽管此处未显示)。 如果不这样做,用户将不得不在每次访问时重新进行身份验证 使用你的应用程序。实现存储密钥的一种常见方法是 Android的SharedReferences APIJava 在Android上使用保存的Dropbox身份验证详细信息,java,android,oauth,dropbox,dropbox-api,Java,Android,Oauth,Dropbox,Dropbox Api,在Dropbox网站上的文章中,他们有一个教程,指导如何在Android上使用核心API 当应用程序第一次启动时,要求用户验证软件以使用用户Dropbox帐户。身份验证成功完成后,您将收到一对身份验证字符串、密钥和密钥 在用户验证应用程序使用其Dropbox帐户后,我使用Android的SharedReferences保存密钥和secred 如何使用这些保存的值?我不是指如何使用SharedReference检索它们,而是指如何使用它们来防止再次验证应用程序?在Dropbox网站上,他们没有提供
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!!");
}
}
}
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!!");
}
}