【问题标题】:OAuth2 with Desktop Application Security具有桌面应用程序安全性的 OAuth2
【发布时间】:2018-12-26 04:57:42
【问题描述】:

我有一个 Electron 应用程序,它基本上是一个 Google Drive 客户端。我打算使用 OAuth 2。

但是,Google API 要求我在生成 client_secret 的地方注册我的应用程序。由于这是一个桌面应用程序,我将 client_secret 存储在服务器中。验证URL在服务器中生成并发送给用户。

我担心人们会冒充应用程序并代表我的 client_secret 做事。如果有恶意的人创建了未经授权的应用程序并向我的服务器发送请求,理论上他们可以代表我的应用程序做恶意的事情。

我可以做些什么来缓解这个问题,或者这不是问题吗?

edit:人们只会访问他们自己的文件。就像他们在 drive.google.com 上一样(读/写/删除文件)

【问题讨论】:

  • 您能否更新您的问题以说明用户是谁以及该应用将访问哪些云端硬盘资源(例如他们自己的或其他人的)
  • @pinoyyid,已更新。

标签: security oauth-2.0 google-drive-api electron desktop


【解决方案1】:

编辑: 验证请求来自您的桌面应用程序而不是克隆到您的服务器实际上是不可能的,除非您控制它的安装位置,但对于用户程序,您不需要。你可以设置一些微不足道的障碍,但你不能提供任何保证。看起来 iOS/Android 正在这方面发展,我想唯一可行的实现是操作系统代表您发送经过验证的凭据,即操作系统级别的支持,而不是应用程序级别的支持。

至于一般的 OAuth 2.0 认证方式...

如果我们在这里走动,我们可以分析每种授权方式,看看这样做的风险。 https://developers.google.com/identity/protocols/OAuth2

  1. https://developers.google.com/identity/protocols/OAuth2WebServer(我想你在这个阵营,但这里没有client_secret
    • 只有针对您的客户端凭据的 DOS 风险。 响应只会被确认并转发到指定的重定向 Uri,因此可以代表您发出令牌请求,但只有您的服务器会收到令牌(假设用户代理不错),您应该处理收到未知令牌响应的情况。
  2. https://developers.google.com/identity/protocols/OAuth2InstalledApp

    • 用户安装恶意应用的风险。当您丢失了client_idclient_secretredirectUri(您无法将它们保密以防设备调试),那么任何人都可以代表您制作应用程序。对于移动应用程序来说,这是一个不幸的问题。目前唯一的防御是用户同意屏幕,也就是说,希望用户通过查看同意屏幕注意到他们被骗从商店安装恶意应用程序而不是您的合法应用程序。

      我希望看到这方面的更多工作,也许应用商店可以代表您持有一些凭据,然后确认这是您的应用请求,我想这将涉及一些哈希检查等。

      我会更乐意在这个问题上得到纠正,但我认为没有什么能阻止上述问题:P

  3. https://developers.google.com/identity/protocols/OAuth2UserAgent
    • 同 1。
  4. https://developers.google.com/identity/protocols/OAuth2ForDevices
    • 同 2。

【讨论】:

  • 也许这实际上是错误的角度,再次阅读您的问题:D 我将其留在这里用于一般目的......
  • 我已经编辑了我认为是原始问题的答案,不幸的是答案是,你不能......
  • 对于第二个选项,API ID 和客户端密码存储在程序内部。我会因为恶意行为者可以在他们自己的恶意程序上使用我的 client_secret 和 API ID 滥用 Google TOS 而被禁止吗?另外,考虑到第二个选项中的 client_secret 甚至不是秘密并且 api id 正在识别应用程序,它的意义何在?
  • 它被称为“秘密”是有原因的。是的,谷歌可以采取措施,这是正确的。当用户使用 OAuth 向应用授予权限时,他们将这些权限授予客户端 ID。使用您的客户端密码,恶意行为者可以创建与您的原始代码具有相同权限的恶意软件。
  • @Nigel 你可以在下面接受 pinoyyid 的建议,但如果它是一个 Electron 应用程序,你真的可以访问一些网络视图吗?所以我只会在应用程序中执行流程 1 或 3,而忘记 client_secret,您可以使用 state 参数将服务器与应用程序发出的请求绑定:P
【解决方案2】:

我个人会创建一个模仿 Google Drive REST API 的代理服务,但实现您自己的 AAA 机制。这样一来,所有机密信息都在服务器上得到保护,您可以添加细粒度的访问控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 2019-06-11
    • 2014-07-26
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多