Dropbox Api AccessToken已更改

时间:2013-02-26 18:54:27

标签: android authentication file-upload dropbox-api

我正在开发一个有可能提供大量统计信息的Android应用程序。我想将这些数据保存在我的保管箱中,以便稍后进行分析。

所以我使用AuthActivity来获取我自己帐户的密钥和秘密,然后我硬编码以获取AcessTokenPair实例:

    AcessTokenPair tokenPair = new AccessTokenPair("key", "secret");
    mDBApi.getSession().setAccessTokenPair(tokenPair);

然后我使用下面的AsyncTask将文件发送到我的Dropbox:

    private class SendToDropbox extends AsyncTask<String, Void, String> {

        @SuppressWarnings("deprecation")
        @Override
        protected String doInBackground(String... arg0) {
            // TODO Auto-generated method stub

            String timestamp = new Date().toString();
            FileInputStream inputStream = null;
            DisplayMetrics dm = new DisplayMetrics();
            win.getDefaultDisplay().getMetrics(dm);
            double x = Math.pow(dm.widthPixels / dm.xdpi, 2);
            double y = Math.pow(dm.heightPixels / dm.ydpi, 2);
            double screenInches = Math.sqrt(x + y);
            File sdcard = new File(Environment.getExternalStorageDirectory()
                .getPath());
            File session = null;

            try {
                 session = File.createTempFile("analytics_" + timestamp, ".txt", sdcard);

                if (session.exists()) {
                    PrintStream ps = new PrintStream(session);
                    ps.println("Screen Size: " + screenInches);
                    ps.println("Device: " + android.os.Build.MODEL);
                    ps.println("Carrier: " + android.os.Build.BRAND);
                    ps.println("Locale: " + Locale.getDefault().toString());
                    ps.println("OS: " + android.os.Build.VERSION.SDK);
                    ps.println("${EOF}");

                    ps.checkError();
                    ps.close();

                    inputStream = new FileInputStream(session);
                    com.dropbox.client2.DropboxAPI.Entry newEntry = mDBApi
                        .putFile("Analytics" + File.separator
                                + session.getName(), inputStream,
                                session.length(), null, null);
                    if (session.delete()) {
                    } else {
                        session.deleteOnExit();
                    }
                    Log.i("DbExampleLog", "The uploaded file's rev is: "
                        + newEntry.rev);
                } else {
                Log.e("DropBoxFile", "SD NOT MOUNTED!!");
                }

            } catch (DropboxUnlinkedException e) {
                // User has unlinked, ask them to link again here.
                Log.e("DbExampleLog", "User has unlinked.");
            } catch (DropboxException e) {
                Log.e("DbExampleLog", "Something went wrong while uploading.");
            } catch (FileNotFoundException e) {
                Log.e("DbExampleLog", "File not found.");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                    }
                }
            }

          return null;
    }

此代码的唯一问题是它只能在访问令牌更改之前的几周内工作。这意味着我必须每隔几周手动更新apk,这不太可行。相反,我想将密钥存储在我可以通过http访问的网站或在线文件中。

是否有免费程序不需要帐户访问权限,并允许您在网络上传和编辑.txt文件?

2 个答案:

答案 0 :(得分:1)

访问令牌目前尚未到期,但未来可能会发生变化。您需要非常小心,永远不要将您的应用与用于生成令牌的帐户取消关联,因为这会使难以编码到您的应用中的令牌无效。

但出于安全原因,我不能推荐这个。可以通过对应用程序进行逆向工程的人员发现嵌入到应用程序中的令牌。拥有该令牌的任何人都不仅可以阅读,还可以写入令牌可以访问的Dropbox(或App文件夹),这样做可能会搞砸了您应用的其他用户。

答案 1 :(得分:0)

来自Dropbox最佳做法:Best Practices

  

如果撤销访问权限,您的应用应采取预防措施。用户可以禁用访问令牌(来自帐户页面),Dropbox管理员在滥用时撤消访问令牌,或者只是随着时间的推移而过期。

     

如果令牌不再被授权,REST API将返回HTTP Error 401 Unauthorized响应。 iOS SDK会为您检测401,并会在会话的委托上调用sessionDidReceiveAuthorizationFailure:方法,以通知您授权已被撤销。 Android,Python,Ruby和Java SDK都会引发您可以捕获和检查的服务器错误的异常。重新认证通常是重新获得访问权所必需的。

因此,访问令牌肯定会随着时间而改变。你必须足够灵活处理这个问题。