0

我正在开发一个有可能提供大量统计信息的 android 应用程序。我想将此数据保存在我的 Dropbox 中以供以后分析。

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

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

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

    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 文件的免费程序?

4

2 回答 2

1

访问令牌当前不会过期,但将来可能会发生变化。但是,您需要非常小心,切勿将您的应用程序与用于生成令牌的帐户取消链接,因为这会使硬编码到您的应用程序中的令牌无效。

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

于 2013-07-10T21:59:33.797 回答
0

来自 Dropbox 最佳实践:最佳实践

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

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

所以访问令牌肯定会随着时间而改变。你必须足够灵活来处理它。

于 2013-07-09T17:12:56.500 回答