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

Bri*_*oll 11 credentials google-drive-api

我已成功安装并运行名为DriveCommandLineGoogle Drive Quick Start应用程序.我还调整了一点,以获取我的云端硬盘帐户中的一个文件的GET文件信息.

我现在要做的是以某种方式保存凭证并重新使用它们,而无需用户每次都必须访问网页才能获得授权代码.我已查看此页面,其中包含检索和使用OAuth 2.0凭据的说明.为了使用示例类(MyClass),我修改了DriveCommandLine中实例化Credential对象的行:

Credential credential = MyClass.getCredentials(code, "");
Run Code Online (Sandbox Code Playgroud)

这会导致抛出以下异常:

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)
Run Code Online (Sandbox Code Playgroud)

我一直在研究这些API(Google Drive和OAuth)2天,但进展甚微.我非常感谢上述错误以及获得持久凭据的问题.

整个结构对我来说似乎不必要地复杂化.有人想解释为什么我不能通过传入我的谷歌用户名和密码来创建一个简单的凭据对象?

谢谢,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();
Run Code Online (Sandbox Code Playgroud)

我现在遇到的问题是,当我尝试使用flow(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)
Run Code Online (Sandbox Code Playgroud)

我应该使用其他范围吗?我目前正在使用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");
Run Code Online (Sandbox Code Playgroud)

谢谢!

pin*_*yid 13

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

我的一些学习......

  • 请求用户权限时,请指定"offline = true".这将("有时"sic)返回一个refreshtoken,这与具有受限权限的密码一样好.您可以存储它并在任何时候重复使用它(直到用户撤销它)来获取访问令牌.

  • 我的感觉是谷歌SDK更像是一种阻碍而不是帮助.我一个接一个地停止使用它们,现在直接调用REST API.

  • 最后一点,您可以(仅)使用Google客户端登录协议访问上一代API.然而,这完全被弃用,很快就会被关闭.OAuth旨在对授权进行细粒度控制,这本质上是复杂的.因此,尽管我同意它很复杂,但我认为这并不是必然的.我们生活在一个复杂的世界:-)

您和我的经验表明,开发社区仍然需要一个整合的文档和配方,以便将这些内容放入我们的后视镜中,这样我们就可以专注于手头的任务.