2

我正在用 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 世界中实际上是“秘密”。换句话说,可以将它嵌入到您的应用程序中,因为它是秘密的,但不能以恶意方式使用(希望如此)......

查看这些相关问题的答案:

一个 Google 页面甚至提到“在这种情况下,客户端机密显然不被视为机密”。

来谷歌,解释一下安全性是如何工作的:-)

4

1 回答 1

1

好的,我想我找到了答案。

与 Dropbox 类似,Google 可以将 OAuth 2 与 PKCE 一起使用,他们只是使用完整的拼写“Proof Key for Code Exchange”,这可能就是我一开始没有找到它的原因:-)。详细信息在这里: https ://developers.google.com/identity/protocols/oauth2/native-app#obtainingaccesstokens

我没有在 Google API 中找到等效的过程,但这些 API 是几兆字节的类,所以我可能错过了它。基本上,只需要发送一些请求并听取响应,所以我想我会从头开始实现它(并且可能还会摆脱 Dropbox 的客户端库,因为过程非常相似)。

希望能帮助到你...

编辑:这并没有解决问题,因为在干净的 PKCE 程序之后,应用程序仍然必须发送其私钥来交换令牌的授权码。在我的问题中查看编辑

于 2020-06-19T00:17:17.673 回答