我已经成功安装并运行名为 DriveCommandLine 的 Google Drive 快速启动应用程序 https://developers.google.com/drive/quickstart。我还对其进行了一些调整,以获取我的云端硬盘帐户中的一个文件的文件信息。
我现在想做的是以某种方式保存凭据并重新使用它们,而用户不必每次都访问网页来获取授权码。我已经结帐了这一页 https://developers.google.com/accounts/docs/OAuth2以及检索和使用 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)两天了,但进展甚微。我真的很感谢针对上述错误以及获取持久凭证的问题提供的帮助。
对我来说,整个结构似乎不必要地复杂。有人愿意解释为什么我不能通过传入我的 Google 用户名和密码来创建一个简单的 Credential 对象吗?
谢谢,
布莱恩·奥·卡罗尔,都柏林,爱尔兰
* 更新 *
好的,我刚刚解决了上述错误,现在又出现了一个新错误。
我解决第一个问题的方法是修改 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");
Thanks!