在纯文本中声明授权凭证是好做法吗?



以明文形式声明GCP应用程序授权凭证(即客户端ID和客户端秘密)是否良好?

我一直在用c#开发一个Windows桌面应用程序,这涉及到将文件上传到Google Drive。我真正担心的是,当我必须发布应用程序时,应用程序的Client ID/Client Secret应该被披露,因为我已经将它们作为变量存储在应用程序中。它安全吗?或者是否有其他更好的方式将它们存储在您的应用程序中,同时使用GCP授权?

要明确的是,我们讨论的是在Google云控制台创建的application credentials(客户端id和客户端秘密),而不是在用户同意应用程序访问其数据时创建的user credentials(刷新令牌,访问令牌)。

如果你查看google的服务条款,你会发现它写着:

主题:Google api服务条款变更

要求开发人员做出合理的努力来保持他们的私钥的私密性,而不是将它们嵌入到开源项目中。

这也适用于桌面应用程序。例如,你不应该在你的应用程序中包含一个用户可以以明文打开并看到你的客户端id和客户端秘密的设置文件。它应该被编译到你的应用程序中(是的,应用程序可以被反编译,并且用户可以通过这种方式获得它们),或者最好是存储在你的服务器上,以便你的应用程序可以在需要时请求它。但是,如果您的应用程序也被设计为离线工作,则这不是最佳选择。

Google意识到将凭证编译到应用程序中存在灰色地带。它被认为是可接受的风险。(几年前我和Oauth团队讨论过这个问题)

为什么你应该保护你的凭证。

主要问题是,如果有人得到你的客户端id和客户端秘密,他们就可以使用它,谷歌没有办法知道它不是你。更糟糕的是,应用程序的用户也不知道。所以,如果他们开始发送垃圾邮件或泄露数据,你的应用程序和你将受到指责。

OAuth是关于用户授权应用程序使用其资源。如果这是一个其他人正在使用的应用程序,将文件发送到他们的Google drive,那么他们应该在应用程序中输入他们自己的凭据。

如果应用程序被其他人用来上传文件到你的Google Drive,那么OAuth不是正确的方式,因为你描述的原因。相反,您可能需要某种API供桌面应用程序调用,它可以对最终用户隐藏访问Google Drive的凭据。然后,您将有一个不同的问题,即确保只有您打算调用API的人才会调用它。

这真是一个相当复杂的问题。

最新更新