既然它们已经消失,如何实现相当于长期令牌的 Dropbox(dropbox-sdk-js,Meteor,React)

How to achieve the Dropbox equivalent of long-lived token now that they're gone (dropbox-sdk-js, Meteor, React)

一段时间以来,我一直在 Meteor 应用程序中使用 dropbopx-sdk-js,没有任何问题。

我的 Meteor 应用只是使用 Dropbox 来获取要在产品卡片中使用的图像。这些文件不时同步,仅此而已。通过同步,我的意思是它们被扫描、共享 links 创建或获取,然后一些信息保存在 Mongo 中(名称、扩展名、路径、public link )

最终用户不会删除或添加文件,这些文件也不与最终用户特定帐户相关。

为了实现这一点,我(在过去)在 Dropbox 应用程序控制台中创建了一个应用程序,生成了一个永久令牌,并在我的 Meteor 应用程序中使用该令牌来处理所有同步。

现在我试图在一个新的类似项目中复制同样的东西,但发现永久令牌最近已被弃用,不再是一个选项。

现在,检查 Dropbox 的 Authentication Types 在我看来像是“App Authentication”

"This type only uses the app's own app key and secret, and doesn't identify a specific user or team".

是我所追求的。我可以安全地在服务器中专门提供应用程序密钥和机密,因为客户端永远不需要这些。问题是我如何实现这种身份验证?或者就此而言,我如何为我的应用程序实现等效的长期令牌,最终意味着最终用户实际上不需要以任何方式知道 Dropbox 在幕后(而且他们肯定不需要 Dropbox使用此应用程序的帐户也不应提示任何 Dropbox 身份验证页面)

在 js-sdk 示例 repo 中,我只发现 this example 使用应用程序密钥和密钥。然而,无论如何它都会在浏览器中通过 oauth 过程。如果我不做 oauth 部分,我会得到一个错误

"error": {
    "name": "DropboxResponseError",
    "status": 409,
    "headers": {},
    "error": {
        "error_summary": "path/unsupported_content_type/...",
        "error": {
            ".tag": "path",
            "path": {
                ".tag": "unsupported_content_type"
             }
         }
    }
}

作为调用的结果

dbx.filesListFolders({ path: '', recursive: true }):

如果我用生成的令牌替换 dbx 对象的初始化,一切都会正常进行。但是最终令牌过期了,我又回到了原点。

知道我可能遗漏了什么吗?

简短的回答是:

您需要获得一个refresh-token。然后,您可以根据需要使用此令牌。但是为了获得它,必须在浏览器中至少通过一个 oauth 流程。然后在后端捕获生成的 refresh-token 。然后存储它并用它来初始化API。所以这有点“hacky”(IMO)。

例如,您可以使用提到的示例代码,以及 log/store 在 this line 中获得的刷新令牌(根据 Greg 在论坛中接受的答案)。然后将该值用作常量以在初始化时立即调用 setRefreshToken 方法(就像在同一行中所做的那样)。

长答案是:

  1. ClientId + 客户端密码不足以以编程方式生成刷新令牌。
  2. 必须至少通过一次 oauth 流程才能获得刷新令牌
  3. 如果您想对您的客户隐藏此类流程,您需要按照简短回答中的说明进行操作。
  4. Dropbox 的预期使用流程是:每个用户访问自己的文件。官方不支持多个用户访问一个文件夹。

较长的答案是:

查看 Dropbox 论坛中的conversation we had

我建议将控制台中的“生成访问令牌”按钮替换为“生成刷新令牌”按钮。根据我们讨论的内容,至少对我来说是有意义的。也许如果它得到一些喜欢...;)。