【问题标题】:How to properly store client secret for Google Drive API on Electron app?如何在 Electron 应用程序上正确存储 Google Drive API 的客户端密码?
【发布时间】:2021-04-19 16:31:53
【问题描述】:

我有一个需要访问用户 Google Drive 的 Electron 应用程序,我想实现 api 功能而不必公开客户端密码。据我了解,这在移动应用程序等某些场景中是不可能做到的,但是在本地应用程序上进行此操作的正确方法是什么?

在尝试遵循 Google 的 web-app OAuth 说明时,您似乎无法在本地应用程序上使用此方法。当尝试以这种方式设置 OAuth 过程时,它甚至不允许您将 localhost 列入白名单作为域来对用户进行身份验证(这会破坏该过程,因为这是在 Electron 上运行的本地应用程序)。再加上谷歌发布的paper,你似乎不能欺骗身份验证进程认为它没有在本地主机上运行,​​你也不能在浏览器中运行 Node.js(我正在使用电子所以这是不可能的)。

然后我尝试遵循他们的 Mobile and Desktop app 工作流程,这似乎很有希望。当您需要Exchange authorization code for refresh and access tokens 时,就会出现问题。这再次要求您在主应用程序中显示您的客户端密码。然后,我将其拆分并在本地执行一些操作,然后拥有一个身份验证服务器,该服务器保存客户端机密并交换来自客户端的授权代码并返回刷新和访问令牌。查看 Google 提供的用于可视化此过程的 diagram,它清楚地表明您的应用需要执行授权过程的两个部分,因此这个想法也被淘汰了。

我个人使用和查看的一个应用程序是 rclone,从外观上看,他们只是在code 中直接列出了他们的客户端 ID 和机密。客户端密码是加密的,但如果您遵循工作流程,它会使用一个也只是 stored locally on the app 的密钥来显示。所以它的纯文本是模糊的,但是没有什么可以阻止任何人通过稍微修改代码来获取客户端机密。

我还应该提到这个应用程序在 GitHub 上的公共存储库中,并将保持这种状态。

这是我第一次使用 OAuth,所以我可能会误解某些内容,但我尝试尽可能地遵循文档,并且无法摆脱我忽略了这个过程的一部分的感觉。

如果解决此问题的唯一方法是同时公开客户端 ID 和机密信息,是否有任何方法可能导致用户数据泄露?由于 Google Drive API 是免费使用的,我并不介意其他人是否使用我的一些配额。我更担心安全问题。

【问题讨论】:

    标签: node.js oauth-2.0 electron


    【解决方案1】:

    对于您正在开发的桌面应用等公共客户端,您需要使用 PKCE 流程。您是对的,Google 的文档似乎不在此处 - 您不需要将 client_secret 作为授权代码交换的一部分传递。

    这里的文档支持这一点:https://www.oauth.com/oauth2-servers/pkce/authorization-code-exchange/

    Google 可能需要 client_secret,但它不会将该参数视为公共客户端的真正“秘密”,而是一个不敏感的附加标识符,并且它本身不足以执行任何操作代表您的申请。 Section 8.5 of the specification 阅读:

    作为应用程序的一部分静态包含的秘密分发给 不应将多个用户视为机密,将其视为一个 用户可以检查他们的副本并了解共享的秘密。为了这 原因,以及 [RFC6819] 的第 5.3.1 节中所述的那些,它不是 建议授权服务器要求使用共享密钥对公共本机应用程序客户端进行客户端身份验证, 因为除了客户识别之外,这几乎没有价值 已由“client_id”请求参数提供。

    仍然需要静态包含共享的授权服务器 本机应用程序客户端的秘密必须将客户端视为公共 客户端(由 OAuth 2.0 [RFC6749] 的第 2.1 节定义),而不是 接受秘密作为客户身份的证明。没有 附加措施,此类客户可能会被冒充客户 (参见第 8.6 节)。

    您还可以查看独立的 OAuth 服务提供商,例如我工作的 Xkit。这样一来,您仍可以在通过 OAuth 流程的同时保持机密的机密性。

    【讨论】:

    • 如果我确实发布了客户端密码并使用桌面应用程序工作流程,我是否可以在本地存储访问和刷新令牌,这样用户每次打开时都不需要通过谷歌登录本地应用程序?
    • 是的,你可以。由于这仅授予对用户自己资源的访问权限,因此允许他们访问它应该不是问题。但是,由于令牌授予对敏感数据的访问权限,因此您可能会考虑将它们存储在本地的安全性,因为其他应用程序可能可以访问它。例如,对其进行加密可能是一个合理的步骤。一般来说,我可能只存储刷新令牌并将访问令牌保存在内存中 - 它只持续几个小时,所以它可能不值得保存到磁盘。
    猜你喜欢
    • 1970-01-01
    • 2015-02-05
    • 2019-11-03
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2017-05-22
    相关资源
    最近更新 更多