我正在用 Java 编写一个处理照片的开源独立桌面应用程序,并且我正在添加一个功能,让用户将照片上传到他们的 Google 照片帐户,但我面临着一个身份验证/安全问题。
我已注册我的项目以使用 Google Photo API 并下载了我的凭据 JSON 文件。我已经能够成功地将它与java-photoslibrary Github 项目中的示例一起使用,所以一切都很好。
但是,凭证文件包含一个“client_secret”密钥,如果我没记错的话,它不应该被披露(我在这里正确吗?)。但是这些凭证必须以某种方式与应用程序一起分发,并且由于它是开源的,因此基本上是公开的。所以我的问题是:如何在不泄露我的应用程序密钥的情况下向他/她的 Google 照片帐户验证我的应用程序用户?
注意:我已经集成了 Dropbox 上传,他们的桌面应用程序清楚地解释了如何在不使用 OAuth 的令牌流将密钥嵌入桌面应用程序的情况下进行身份验证。谷歌相册有没有等价物?
谢谢。
编辑:取得了一些进展(见下面我自己的答案),但在我终于有时间实施它之后,我意识到在用户授权应用程序并返回有效代码后(耶!),第 5 步(交换代码对于令牌)再次需要 client_secret !:-(
我在没有它的情况下尝试了调用,但我收到“client_secret is missing”错误,所以这不是错字。
经过更多搜索(使用 [google-oauth] 关键字而不是 [oauth-2.0],这说明了一切),似乎“秘密”并不意味着它在 Google 世界中实际上是“秘密”。换句话说,可以将它嵌入到您的应用程序中,因为它是秘密的,但不能以恶意方式使用(希望如此)......
查看这些相关问题的答案:
- 使用 Python 在桌面应用程序中安全分发 OAuth 2.0 client_secret
- 为什么 Google 会为 Native 应用程序提供客户端密码?
- 将 oauth2 与本机 (iOS/Android) 移动应用程序集成
一个 Google 页面甚至提到“在这种情况下,客户端机密显然不被视为机密”。
来谷歌,解释一下安全性是如何工作的:-)