当前位置: 首页 > 知识库问答 >
问题:

谷歌云端硬盘/OAuth - 不知道如何获得可重复使用的谷歌证书

佟阳飙
2023-03-14

我已经成功安装并运行了名为DriveCommandLine的Google Drive快速启动应用程序。我还对它进行了一些修改,以获取我的驱动器帐户中的一个文件的文件信息。

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

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用户名和密码来创建一个简单的凭证对象吗?

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

*更新*

好的,我刚刚绕过了上面的错误,现在我有了一个新的错误。

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

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

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

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");

谢啦!

共有3个答案

傅阳炎
2023-03-14

好的,我终于解决了上面的第二个问题,我终于得到了一个带有访问令牌和刷新令牌的工作GoogleCredential对象。

我一直试图通过修改MyClass(管理凭据的类)中的作用域列表来解决作用域问题。最后,我需要调整DriveCommandLine的修改版本(最初用于获取授权代码的版本)中的作用域。我从Oauth2Scopes添加了2个作用域:

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
    httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET,
    Arrays.asList(DriveScopes.DRIVE, Oauth2Scopes.USERINFO_EMAIL, Oauth2Scopes.USERINFO_PROFILE))
    .setAccessType("offline").setApprovalPrompt("force").build();

添加用户信息的作用域允许我稍后在 MyClass 中获取用户标识。我现在可以使用 userid 将凭据存储在数据库中以供重复使用(而不必让用户每次都转到 URL)。我还按照 pinoyyid 的建议将访问类型设置为“脱机”。

晏志明
2023-03-14

宣誓2示波器的导入方式如下:

import com.google.api.services.oauth2.Oauth2Scopes;

您需要在您的类路径中有jar文件“Google-API-services-oauth 2-v2-rev 15-1 . 8 . 0-beta . jar”来访问该包。可以在这里下载。

不,我不知道如何在不访问授权URL至少一次并复制代码的情况下获得凭证。我修改了我的类来存储和检索数据库中的凭证(在我的例子中,它是一个简单的表,包含userid、accesstoken和refreshtoken)。这样,我只需获得一次授权代码,一旦获得访问/刷新令牌,我就可以重用它们来创建一个GoogleCredential对象。下面是我制作GoogleCredential对象的方法:

GoogleCredential credential = new GoogleCredential.Builder().setJsonFactory(jsonFactory)
            .setTransport(httpTransport).setClientSecrets(clientid, clientsecret).build();
    credential.setAccessToken(accessToken);
    credential.setRefreshToken(refreshToken);

只需在上面输入您的clientid、clientsecret、accessToken和refreshToken。

我真的没有太多的时间来分离和整理我的整个代码,将其发布到这里,但如果您仍然有问题,请告诉我,我会看看我能做什么。不过,你实际上是在向盲人问路。我对整个系统的理解非常粗略!

干杯布莱恩

陆飞鸿
2023-03-14

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

我的一些经验...

> < li>

当您请求用户权限时,请指定" offline=true "。这将(“有时”原文如此)返回一个refreshtoken,它相当于带有受限权限的密码。您可以存储它,并在任何时候重用它(直到用户撤销它)来获取访问令牌。

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

关于你的最后一点,你可以(只是)使用谷歌客户端登录协议来访问上一代的API。但是这是完全不建议使用的,很快就会被关闭。OAuth旨在对本质上复杂的授权进行细粒度的控制。所以虽然我同意这很复杂,但我不认为这是不必要的。我们生活在一个复杂的世界里:-)

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

 类似资料:
  • 对于我的Google App Engine应用程序,我希望使用服务帐户自己的Google驱动器,即我不希望创建“常规”gmail帐户并向我的服务帐户授予特权,也不希望与任何其他人共享文件,我只希望将该驱动器用作应用程序的“内部文件系统”,仅由应用程序访问。 我的问题是: 1) 是否仍提供此类服务,即是否允许服务帐户使用其自己的专用驱动器,或者我是否被迫使用“新”谷歌云存储? 2)我在哪里可以找到任

  • 我想做一个API让谷歌驱动器视频链接在JW播放器和mysite视频上播放(api.getlinkdrive.com),但我只是找不到这样做的方法。 最近,我在github上找到了一些源代码(https://github.com/marxvn/gdrive).我已经为我的网站修改了它。代码工作正常,但链接无法播放(请参见此处的示例:http://getlinkdrive.byethost7.com/

  • 现在,我们有一个带有谷歌文档Api和2条腿的oauth的应用程序。但是,我们希望迁移到使用Oauth 2.0的谷歌驱动器API。 我们可以在Google Drive Api中使用双腿oauth吗?有什么例子吗?

  • 我尝试过将deendpoint与云SQL和Hibernate集成。但是,每次都有错误。跟随我的测试: 1 -源文件夹中的persistence . XML:http://imgur.com/hKjf8Cs给我错误:http://imgur.com/QJe8rvq 2-资源文件夹中的persistence.xml给我错误: ServletInitializationParameters.java:5

  • 两个月前,在使用JavaScript授权Google Drive中, @Nivco写了一篇关于“处理文件内容”的文章,这是一篇非常诱人的文章: 我们还可以改进文件内容服务器,使其支持XHR请求。 那么,“我们”在哪里可以找到关于这个功能的新闻或路线图、信息等呢? 实际上,这个问题是一个回答...(到另一个问题)

  • 我一直在开发一个移动应用程序,它使用HTTP POST/GET来检索文件/文件夹列表,上传/下载文件等。,这似乎与GData文档列表API配合得很好。既然GDrive SDK V2已经推出,我将转向新的API。 当我将身份验证范围从https://docs.google.com/feeds/到https://www.googleapis.com/auth/drive,我得到了一个400错误。我了解