gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:52:08 25 4
gpt4 key购买 nike

我已成功安装并运行 Google Drive Quick Start application called DriveCommandLine .我还对其进行了一些调整,以获取我的云端硬盘帐户中的一个文件的文件信息。

我现在想做的是以某种方式保存凭据并重新使用它们,而用户不必每次都访问网页来获取授权码。我已 checkout this page带有检索和使用 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)2 天了,但进展甚微。对于上述错误以及一般获取持久凭据的问题,我真的很感激。

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

谢谢,
Brian O Carroll,爱尔兰都柏林

* 更新 *

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

我解决第一个问题的方法是修改 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");

谢谢!

最佳答案

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

我的一些学习...

  • 当您请求用户权限时,请指定“offline=true”。这将(“有时”原文如此)返回一个刷新 token ,它与具有受限权限的密码一样好。您可以存储它并随时重复使用它(直到用户撤销它)以获取访问 token 。
  • 我的感觉是,Google SDK 与其说是帮助,不如说是阻碍。一个一个,我已经停止使用它们,现在直接调用 REST API。
  • 最后一点,您可以(仅)使用 Google 客户端登录协议(protocol)来访问上一代 API。但是,这已完全弃用,不久将被关闭。 OAuth 旨在对本质上复杂的授权进行细粒度控制。因此,尽管我同意这很复杂,但我认为这不是不必要的。我们生活在一个复杂的世界:-)

  • 你和我的经验表明,开发社区仍然需要一个整合的文档和方法来将这些东西放入我们的后视镜中,这样我们就可以专注于手头的任务。

    关于google-drive-api - Google Drive/OAuth - 无法弄清楚如何获得可重复使用的 GoogleCredentials,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12479551/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com