Google Drive/OAuth - 无法弄清楚如何获得可重复使用的 GoogleCredentials

2024-04-21

我已经成功安装并运行名为 DriveCommandLine 的 Google Drive 快速启动应用程序 https://developers.google.com/drive/quickstart。我还对其进行了一些调整,以获取我的云端硬盘帐户中的一个文件的文件信息。

我现在想做的是以某种方式保存凭据并重新使用它们,而用户不必每次都访问网页来获取授权码。我已经结帐了这一页 https://developers.google.com/accounts/docs/OAuth2以及检索和使用 OAuth 2.0 凭据的说明。为了使用示例类 (MyClass),我修改了 DriveCommandLine 中实例化 Credential 对象的行:

Credential credential = MyClass.getCredentials(code, "");

这会导致抛出以下异常:

java.lang.NullPointerException
    at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:187)
    at com.google.api.client.json.jackson.JacksonFactory.createJsonParser(JacksonFactory.java:84)
    at com.google.api.client.json.JsonFactory.fromInputStream(JsonFactory.java:247)
    at com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.load(GoogleClientSecrets.java:168)
    at googledrive.MyClass.getFlow(MyClass.java:145)
    at googledrive.MyClass.exchangeCode(MyClass.java:166)
    at googledrive.MyClass.getCredentials(MyClass.java:239)
    at googledrive.DriveCommandLine.<init>(DriveCommandLine.java:56)
    at googledrive.DriveCommandLine.main(DriveCommandLine.java:115)

我已经研究这些 API(Google Drive 和 OAuth)两天了,但进展甚微。我真的很感谢针对上述错误以及获取持久凭证的问题提供的帮助。

对我来说,整个结构似乎不必要地复杂。有人愿意解释为什么我不能通过传入我的 Google 用户名和密码来创建一个简单的 Credential 对象吗?

谢谢, 布莱恩·奥·卡罗尔,都柏林,爱尔兰

* 更新 *

好的,我刚刚解决了上述错误,现在又出现了一个新错误。

我解决第一个问题的方法是修改 MyClass.getFlow()。我没有从 json 文件创建 GoogleClientServices 对象,而是使用了不同版本的 GoogleAuthorizationCodeFlow.Builder,它允许您直接以字符串形式输入客户端 ID 和客户端密钥:

flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, jsonFactory, "<MY CLIENT ID>", "<MY CLIENT SECRET>", SCOPES).setAccessType("offline").setApprovalPrompt("force").build();

我现在遇到的问题是,当我尝试使用流程(GoogleAuthorizationCodeFlow 对象)交换 Credentials 对象的授权代码时,出现以下错误:

An error occurred: com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "invalid_scope"
}
googledrive.MyClass$CodeExchangeException
        at googledrive.MyClass.exchangeCode(MyClass.java:185)
        at googledrive.MyClass.getCredentials(MyClass.java:262)
        at googledrive.DriveCommandLine.<init>(DriveCommandLine.java:56)
        at googledrive.DriveCommandLine.main(DriveCommandLine.java:115)

我还应该使用其他范围吗?我目前正在使用 MyClass 提供的范围数组:

private static final List<String> SCOPES = Arrays.asList(
        "https://www.googleapis.com/auth/drive.file",
        "https://www.googleapis.com/auth/userinfo.email",
        "https://www.googleapis.com/auth/userinfo.profile");

Thanks!


我感受到你的痛苦。我已经两个月了,但仍然感到惊讶。

我的一些学习...

  • 当您请求用户权限时,请指定“offline=true”。这将(“有时”原文如此)返回一个刷新令牌,它与具有受限权限的密码一样好。您可以存储它并随时重复使用它(直到用户撤销它)以获取访问令牌。

  • 我的感觉是,Google SDK 与其说是帮助,不如说是一种阻碍。我已经一一停止使用它们,现在直接调用 REST API。

  • 关于最后一点,您可以(仅)使用 Google 客户端登录协议来访问上一代 API。然而,这已被完全弃用,并将很快被关闭。 OAuth 旨在提供细粒度的授权控制,这本质上是复杂的。因此,尽管我同意这很复杂,但我认为并非没有必要。我们生活在一个复杂的世界:-)

你和我的经验表明,开发社区仍然需要一个综合的文档和方法来将这些内容纳入我们的后视镜中,以便我们可以专注于手头的任务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Drive/OAuth - 无法弄清楚如何获得可重复使用的 GoogleCredentials 的相关文章

随机推荐