我已成功安装并运行名为 DriveCommandLine 的 Google Drive 快速启动应用程序。我还对其进行了一些调整,以获取我的云端硬盘帐户中的一个文件的文件信息。
我现在想做的是以某种方式保存凭据并重新使用它们,而用户不必每次都访问网页来获取授权码。我已查看此页面,其中包含有关检索和使用 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");
谢谢!