我已经成功地安装和运行了Google快速启动应用程序名为DriveCommandLine。我还对其进行了一些调整,以获取我的驱动器帐户中的一个文件的文件信息。
我现在想要做的是以某种方式保存凭证,并重复使用它们,而无需用户每次访问一个网页就可以获得授权代码。我已经签出了此页,并提供了检索和使用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和OAuth) 2天了,但进展甚微。对于上面的错误和获得持久化凭证的问题,我真的很感激。
这整个结构在我看来是不必要的复杂。有人想解释为什么我不能通过传递我的Google用户名和密码来创建一个简单的凭证对象?
谢谢,Brian O Carroll,爱尔兰都柏林
*更新*
好的,我刚刚克服了上面的错误,现在我有了一个新的错误。
解决第一个问题的方法是修改MyClass.getFlow()。我没有从json文件中创建GoogleClientServices对象,而是使用了不同版本的GoogleAuthorizationCodeFlow.Builder,它允许您以String的形式直接输入客户端ID和客户端机密:
flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, jsonFactory, "<MY CLIENT ID>", "<MY CLIENT SECRET>", SCOPES).setAccessType("offline").setApprovalPrompt("force").build();
我现在遇到的问题是,当我试图使用flow (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");
谢谢!
发布于 2012-09-18 07:15:02
我感觉到你的痛苦。我已经呆了两个月了,还很惊讶。
我的一些学问..。
您和我的经验表明,开发社区仍然需要一个统一的文档和食谱来将这些东西放到我们的后视镜中,这样我们就可以专注于手头的任务。
发布于 2012-09-21 00:45:26
导入Oath2Scopes的方式如下:
import com.google.api.services.oauth2.Oauth2Scopes;
您需要在类路径中使用jar文件'google-api-services-oauth2-v2-rev15-1.8.0-beta.jar‘来访问该包。它可以下载这里。
不,我不知道如何获得凭据,而不必访问授权URL至少一次并复制代码。我修改了MyClass,以从数据库存储和检索凭据(在我的例子中,它是一个简单的表,包含userid、accesstoken和刷新令牌)。这样,我只需要获得一次授权代码,一旦获得访问/刷新令牌,我就可以重用它们来创建一个GoogleCredential对象。下面是如何制作GoogleCredential对象:
GoogleCredential credential = new GoogleCredential.Builder().setJsonFactory(jsonFactory)
.setTransport(httpTransport).setClientSecrets(clientid, clientsecret).build();
credential.setAccessToken(accessToken);
credential.setRefreshToken(refreshToken);
只需在上面输入客户端、客户端机密、accessToken和refreshToken即可。
我真的没有太多的时间来分离和整理我的全部代码在这里张贴,但如果你仍然有问题,让我知道,我会看看我能做什么。不过,你实际上是在向盲人问路。我对整个系统的理解非常粗略!
干杯,布莱恩
发布于 2012-09-19 03:56:11
好的,我终于解决了上面的第二个问题,我终于得到了一个具有访问令牌和刷新令牌的工作GoogleCredential对象。
我一直试图通过修改MyClass (管理凭据的作用域)中的作用域列表来解决作用域问题。最后,我需要调整修改后的DriveCommandLine (最初用于获得授权代码的版本)中的作用域。我从Oauth2Scopes中添加了两个作用域:
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。现在,我可以使用userid将凭证存储在数据库中,以便重用(而不必每次都让用户转到URL )。我还将访问类型设置为“脱机”,正如pinoyyid所建议的那样。
https://stackoverflow.com/questions/12479551
复制