OAuth2与桌面应用程序安全

6
我有一个基本上是谷歌云端硬盘客户端的Electron应用程序。我打算使用OAuth 2. 然而,Google API要求我注册我的应用程序并生成client_secret。由于这是一个桌面应用程序,我的client_secret存储在服务器上。身份验证URL在服务器上生成并发送给用户。 我担心人们可以假装成应用程序并代表我的client_secret执行操作。如果某个恶意意图的人创建未经授权的应用程序并向我的服务器发送请求,他们理论上可以代表我的应用程序执行恶意操作。 是否有什么我可以做来缓解这个问题或者这不是个问题吗?编辑:人们只能访问自己的文件。就像他们在drive.google.com上一样(读/写/删除文件)

你能否更新你的问题,解释一下用户是谁以及应用程序将访问哪些Drive资源(例如他们自己的还是别人的)? - pinoyyid
@pinoyyid,已更新。 - Nigel Chen
2个回答

5
编辑:验证请求是否来自您的桌面应用程序而不是它的克隆到您的服务器上,除非您控制其安装位置,否则实际上不太可能,但对于用户程序,您无法控制。您可以设置一些微弱的屏障,但无法提供任何保证。看起来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相同。

也许我理解错了你的问题,哈哈。为了一般性的目的,我还是把它留在这里吧... - starlight54
我已经编辑回答了我认为是原始问题的内容,不幸的是,答案是,你不能... - starlight54
对于第二个选项,API ID 和客户端密钥存储在程序中。如果恶意行为者滥用我的客户端密钥和 API ID 在他们自己的恶意程序上违反 Google TOS,我会被禁吗?此外,在第二个选项中,客户端密钥有什么意义,考虑到它甚至不是机密的,而API ID 是用来识别应用程序的? - Nigel Chen
它被称为“秘密”,是有原因的。是的,Google可以采取措施,而且理所当然。当用户使用OAuth授权应用程序时,他们将其授权给客户端ID。使用您的客户端秘密,恶意行为者可以创建具有与原始代码相同权限的恶意软件。 - pinoyyid
@Nigel,你可以采纳下面pinoyyid的建议,但是如果这是一个Electron应用程序,你有访问一些Web视图的权限,对吧?所以我会在应用程序中执行Flow 1或3,并忘记client_secret,你可以使用state参数将服务器与应用程序发出的请求联系起来 :P - starlight54
虽然你必须使其无法欺骗,这可能是可行的或不可行的...在选项2中,client_secret 没有任何意义,在我看来它根本没有多大意义,这就是为什么大多数服务都不会发出它们。 - starlight54

1
个人建议创建一个代理服务,模仿Google Drive REST API,但实现自己的AAA机制。这样所有的秘密都将安全存储在服务器上,并且您可以添加细粒度访问控制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接