依赖 Google API InstalledAppFlow 的应用程序分发
Distribution of application that relys on Google API InstalledAppFlow
问题
如果 InstalledAppFlow 需要 客户端密码 json 文件来执行 oauth2 授权,使用 Google API 的实际应用程序是如何分发的?
客户端机密 json 文件是否应被视为应用程序的一部分并作为常量包含在内?
上下文
目前我正在学习如何使用 oauth2 授权 google API 对 python 模块 google_auth_oauthlib
的访问权限。
而且我发现 Oauth2 授权过程本身需要客户端机密文件用于 InstalledAppFlow 授权方法,但我从未见过要求授权要求客户端机密的应用程序。
经过无数次搜索,我只能找到这个,来自 google identity docs。
The process results in a client ID and, in some cases, a client secret, which you embed in the source code of your application. (In this context, the client secret is obviously not treated as a secret.)
Save the credentials file to client_secrets.json. This file must be distributed with your app.
这是在解释我应该在代码本身中嵌入(包含)客户端机密作为常量吗?
客户端 ID 和客户端密码的问题是它们需要保持安全。 Google 的 TOS 要求开发者保持他们的客户 ID 和秘密安全
Asking developers to make reasonable efforts to keep their private keys private and not embed them in open source projects.
这可能会导致开源应用程序等问题。 Can I really not ship open source with Client ID?
这些年来,我在 google 与 Oauth2 团队进行了几次对话。无论如何编译的已安装应用程序可以在内部编译客户端 ID 和客户端密码,但这不会阻止任何人反编译应用程序并检索客户端 ID 和客户端密码。
有人告诉我他们已经意识到这个问题,而且真的没有办法解决它。
我见过其他选项,其中客户端 ID 和客户端密码会存储在服务器上,然后安装的应用程序会从 Web api 请求它们。这是另一种选择,但您通过 HTTPS 发送它们,即使您对它们进行双重加密也应该被认为是安全的。
事实是真的没有办法解决。最主要的是你不应该发布一个应用程序,例如一个设置文件,其中客户端 id 和客户端密码以明文形式出现,这将 IMO 带来很大的风险,你需要将它编译到你的应用程序中或至少以某种方式对其进行加密。
你不会阻止真正想要得到它的人得到它,但你会阻止大多数人。
为什么安装的应用程序是问题。
有多种类型的应用程序。手机、网络、已安装。
对于移动设备和 Web,可以通过多种方式配置客户端,这样您就可以确保它们只能在您的服务器上运行。对于 Web,您有一个重定向 uri,对于移动设备,有实际的移动设备 api id。
对于已安装的应用程序,这是不可能的,因为它们大多 运行 在本地主机上。您无法知道应用 运行ning 的位置,因此它们处于打开状态。因此,如果有人知道您的客户 ID 和客户机密,那么他们就可以将其用于他们的应用程序。用户无法知道这不是您的官方应用,google.
也不会
既然您有一个 python 脚本,为什么不考虑指导您的用户创建他们自己的客户端 ID 和客户端密码,这样他们就可以独立了。
问题
如果 InstalledAppFlow 需要 客户端密码 json 文件来执行 oauth2 授权,使用 Google API 的实际应用程序是如何分发的?
客户端机密 json 文件是否应被视为应用程序的一部分并作为常量包含在内?
上下文
目前我正在学习如何使用 oauth2 授权 google API 对 python 模块 google_auth_oauthlib
的访问权限。
而且我发现 Oauth2 授权过程本身需要客户端机密文件用于 InstalledAppFlow 授权方法,但我从未见过要求授权要求客户端机密的应用程序。
经过无数次搜索,我只能找到这个,来自 google identity docs。
The process results in a client ID and, in some cases, a client secret, which you embed in the source code of your application. (In this context, the client secret is obviously not treated as a secret.)
Save the credentials file to client_secrets.json. This file must be distributed with your app.
这是在解释我应该在代码本身中嵌入(包含)客户端机密作为常量吗?
客户端 ID 和客户端密码的问题是它们需要保持安全。 Google 的 TOS 要求开发者保持他们的客户 ID 和秘密安全
Asking developers to make reasonable efforts to keep their private keys private and not embed them in open source projects.
这可能会导致开源应用程序等问题。 Can I really not ship open source with Client ID?
这些年来,我在 google 与 Oauth2 团队进行了几次对话。无论如何编译的已安装应用程序可以在内部编译客户端 ID 和客户端密码,但这不会阻止任何人反编译应用程序并检索客户端 ID 和客户端密码。
有人告诉我他们已经意识到这个问题,而且真的没有办法解决它。
我见过其他选项,其中客户端 ID 和客户端密码会存储在服务器上,然后安装的应用程序会从 Web api 请求它们。这是另一种选择,但您通过 HTTPS 发送它们,即使您对它们进行双重加密也应该被认为是安全的。
事实是真的没有办法解决。最主要的是你不应该发布一个应用程序,例如一个设置文件,其中客户端 id 和客户端密码以明文形式出现,这将 IMO 带来很大的风险,你需要将它编译到你的应用程序中或至少以某种方式对其进行加密。
你不会阻止真正想要得到它的人得到它,但你会阻止大多数人。
为什么安装的应用程序是问题。
有多种类型的应用程序。手机、网络、已安装。
对于移动设备和 Web,可以通过多种方式配置客户端,这样您就可以确保它们只能在您的服务器上运行。对于 Web,您有一个重定向 uri,对于移动设备,有实际的移动设备 api id。
对于已安装的应用程序,这是不可能的,因为它们大多 运行 在本地主机上。您无法知道应用 运行ning 的位置,因此它们处于打开状态。因此,如果有人知道您的客户 ID 和客户机密,那么他们就可以将其用于他们的应用程序。用户无法知道这不是您的官方应用,google.
也不会既然您有一个 python 脚本,为什么不考虑指导您的用户创建他们自己的客户端 ID 和客户端密码,这样他们就可以独立了。