使用以前生成的令牌在Android应用中进行Dropbox身份验证

时间:2014-01-03 23:10:20

标签: java android oauth dropbox dropbox-api

我正在开发一个Android应用程序,仅仅是为了我自己,学习android并为自己创造有用的东西。该应用程序是我写的桌面应用程序的扩展。桌面应用程序所做的一件事就是将一些文本数据和图像上传到我为此目的创建的Dropbox帐户。

Android应用程序提供了一个简化的桌面应用程序实现,以便我可以随时随地获得一些相同的功能。因此,当Android应用程序启动时,它会检查Dropbox帐户并下载它尚未拥有的任何新数据。

对于桌面应用程序(Python),我只是通过使用我的Dropbox应用程序密钥(在浏览器中)点击Dropbox auth端点,然后使用我从中获得的“代码”来手动进行身份验证,最终获得访问令牌。所以我已经将该令牌硬编码到我的桌面应用程序中,它绕过oAuth进程并只使用令牌进行身份验证。它正好上传数据。

但是虽然Python Dropbox API允许我这样做,但我不确定如何使用android dropbox API。我一直在浏览JavaDocs中用于API的类,但似乎我必须通过oAuth进程来获取用于身份验证的AccessTokenPair(它似乎包含密钥和秘密)。我是否可以不仅仅将桌面应用程序中使用的相同令牌提供给某个对象(可能是DropboxAPI实例)以进行身份​​验证?

我现在意识到Dropbox的这种用途可能不是很直观,但我现在就投入了,所以如果可以的话我想让它发挥作用。

修改
如果您从先前的身份验证会话中保存了AccessTokenPair(或其值),您似乎可以避免必须通过oAuth进程。看起来AccessTokenPair只是两个字符串的包装:密钥和秘密。所以我想我现在的问题是,这两个值是什么。我有一个访问令牌,这是我的桌面应用程序成功用于身份验证的~64个字符的字符串。我是否可以使用它来创建一个AccessTokenPair对象,如果可以的话,它是一个关键还是秘密,我错过了什么?

SOLUTION:
正如 Smarx 所说,问题是 Android iOS Dropbox客户端使用 oAuth1 Python Ruby PHP Java 客户端使用 oAuth2 。所以,我实际上最终只是关注Android的oAuth1进程,记录生成的访问密钥和秘密,然后硬编码以供将来使用以绕过oAuth进程。它似乎工作正常。

2 个答案:

答案 0 :(得分:1)

您使用的是Core API还是Sync API?

对于Sync API,我认为使用您已有的令牌并不容易。

对于Core API,我认为你可以做到,但我相信Android Core SDK仍然使用OAuth 1,我猜你有一个OAuth 2令牌。

答案 1 :(得分:0)

oauth1 API似乎已被弃用。看起来这肯定是一个缺陷,因为我正在尝试同样的事情,它基本上完全被打破,我可以进行身份​​验证,然后生成一个oauth2令牌,存储但使用它我无法再次登录,除非我重建API对象。

编辑:对于下面的多条评论感到抱歉,我似乎没有权限删除自己的评论。

编辑:我现在可以删除自己的评论,所以答案如下:

//first logon - get the token and save it to shared prefs

if (emboDBApi.getSession().authenticationSuccessful()) { 
    try { 
        emboDBApi.getSession().finishAuthentication(); 
        String accessToken = emboDBApi.getSession().getOAuth2AccessToken();
        SharedPreferences.Editor editor = prefs.edit();   
        editor.putString("emboDBAccessToken", accessToken); editor.apply();     
        } 
    catch (IllegalStateException e) { Log.v(TAG, "Error authenticating", e);
} 

}

//for subsequent logons use the saved token if it exists and then create a    
auth session from that.

AndroidAuthSession newSession = new AndroidAuthSession(Constants.KEY_PAIR,     
prefs.getString("emboDBAccessToken", "")); 
emboDBApi = new DropboxAPI<AndroidAuthSession>(newSession);