【发布时间】: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