我真的不能在客户端ID中包含开源软件吗?

33
开发者凭证(例如密码、密钥和客户端 ID)旨在由您使用并标识您的 API 客户端。您将保密您的凭据,并采取合理措施防止和阻止其他 API 客户端使用您的凭据。开发者凭证不得嵌入到开源项目中。https://developers.google.com/terms/,我的强调)
这是否意味着我的开源 Drive 命令行客户端需要强制每个软件用户在 Google Cloud 控制台中设置新项目?是否有更好的选择?
提取非开源的客户端 ID 和客户端“秘密”并不难,那么为什么要区分?
“安装应用程序”的客户端 ID 和秘密并不是真正的秘密,Google 文档似乎也同意:
该过程会生成客户端 ID,以及在某些情况下生成客户端秘密,您需要将它们嵌入应用程序源代码中。(在此情况下,客户端秘密显然不被视为秘密。)(https://developers.google.com/accounts/docs/OAuth2,同样是我的强调)

4
我投票关闭此问题,因为它涉及许可或法律问题,而非编程或软件开发。请参见这里这里获取详细信息,有关更多信息,请查看[帮助]。 - JasonMArcher
2个回答

32

2014年11月5日,Google对API服务条款进行了一些更改

和你一样,我对以下这句话有疑问。

要求开发人员尽合理努力保持其私钥的私密性,不要将其嵌入到开源项目中。

我在GitHub上有几个开源项目,它们基本上是使用Google API的教程。其中一些API仍然处于beta版本,并且需要时间才能获得beta访问权限。 我将我的客户端ID嵌入到我的项目中,以便我的用户可以测试应用。

现在我在Google有一些联系人,所以我希望我能在这里得到某种豁免。我设法追踪到了上述有争议的服务更改的作者Dan Ciruli,并给他发送了电子邮件。

我的电子邮件相当长,你可以在这里阅读:服务变更

长话短说,不,你不能在开源项目中公开发布你的客户端ID,以下是Dan回复我的电子邮件解释原因。

但是,你让他们在Google的眼中“冒充”你。如果我们的滥用系统检测到滥用(例如,某人试图使用你的密钥DoS我们的服务),你面临着因此终止帐户的风险(请注意-他们不仅会切断密钥的访问权限,而且还会关闭控制台帐户)。此外,你已被授予对一般公众不可用的API进行了白名单访问(很可能需要同意单独的服务条款),并且正在与任何想要它的人共享访问权限。毫无疑问,这是违反那些条款的行为。很抱歉没有您要寻找的答案,但是密钥是我们识别调用我们服务的人的唯一方法。

这只是他回复我的电子邮件的一部分。您可以在上面的链接中阅读完整的帖子。因此,如果您向他们提供源代码并且他们可以看到客户端ID,则您的用户将不得不在Google Cloud控制台上创建自己的项目。无法绕过此问题。

希望对您有所帮助。


1
好吧,如果你所说的“帮助”是指让我对一个好的解决方案失去信心,那么是的。唉,看来只能这样了。非常感谢你的好答案。 - Thomas
抱歉。如果有帮助的话,你并不是唯一一个遇到这个问题的人。我和其他几个人也讨论过这个。任何用于WordPress的PHP插件都会遇到这个问题。 - Linda Lawton - DaImTo
1
Google的设置Google登录的说明(https://developers.google.com/identity/sign-in/web/sign-in)指导您将客户端ID放在<meta>标签中,这意味着它是公开的。显然,客户端密钥不应放置在代码中,但是客户端ID是否打算公开? - reynoldsnlp
我没有看到对bebop评论的回答。我不明白为什么客户端ID应该是“秘密”,因为我可以轻松地通过访问所说的网站,通过点击“Google登录”来获取任何客户端ID。 它就在URL中。它无法隐藏!?也许我应该开始一个关于这个问题的新SO问题。 - Bernard
@Bernard,你提出了一个问题吗? - Yasushi Shoji

4

有一种更好的选择,它被称为OAuth 2.0动态客户端注册。不过,这仍然是一个正在进行中的工作:https://datatracker.ietf.org/doc/html/draft-ietf-oauth-dyn-reg-21。供应商采用和实施可能需要一段时间。

编辑:

在开源应用程序中提供身份验证秘密是绝对不可能的。[老实说,随着开源应用程序的增多,即使是其他应用程序也很难做到。]


这个问题涉及到Google Oauth,而它并不支持你所说的内容。这怎么回答这个问题呢? - Linda Lawton - DaImTo
这个政策我无法理解的原因在于,将凭证放在开源或闭源中没有实质上的区别。无论哪种方式,都可以提取并重复使用它。 - Thomas
2
从封闭源代码或二进制文件中提取它们要更困难一些,而显然这就是谷歌的底线;混淆技术可能会有所帮助(尽管政策没有提到),此外,在动态客户端注册出现之前,没有好的本地移动应用程序替代方案(这就是我认为提到它有意义的原因...)。 - Hans Z.

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