【问题标题】:GoogleCredential won't build without GoogleCredential.Builder没有 GoogleCredential.Builder 就无法构建 GoogleCredential
【发布时间】:2013-02-25 10:16:34
【问题描述】:

在 OAuth2 的 Google 文档中,此处描述了使用身份验证令牌构建 GoogleCredential

Credential and Credential Store

特别是提供了这个代码 sn-p:

GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);
Plus plus = Plus.builder(new NetHttpTransport(), new JacksonFactory())
    .setApplicationName("Google-PlusSample/1.0")
    .setHttpRequestInitializer(credential)
    .build()

当我尝试以这种方式构建 GoogleCredential 时,我得到了简洁的信息:

Please use the Builder and call setJsonFactory, setTransport and setClientSecrets

在异常的消息字段中。我上周下载了这个库,所以我不确定发生了什么。文档是不是已经过时了?如果是,什么方法已经取代了这个作为从现有身份验证令牌和刷新令牌构建的最佳实践?

顺便说一句,不能使用 Builder 的原因是 Google 应用程序控制台没有提供客户端密码;它说不再为Android应用程序等提供它们。因此,setClientSecrets(...) 无法调用。

【问题讨论】:

  • 你弄明白了吗?我有同样的问题。
  • 我们从来没有这样做过。我们最终将文档放入用户控制的谷歌驱动器中,然后用纯机器控制的谷歌驱动器共享​​>它们,这给了我们同样有效的控制。
  • 嗯,它在某种程度上对我有用.. 将发布作为答案.. 显然现在对你没有任何帮助.. 但对于像我这样的其他观众.. :)
  • 好的,抱歉,我不知道安卓应用没有客户端密码.. 但是他们有 apikey 吗?
  • 我不记得了(虽然我想是这样)。不过,无论如何,我总是以简短的信息告终!

标签: android google-drive-api


【解决方案1】:

我最近遇到了这个问题,并为我的案例找到了解决方案。

这里是运行条件:程序在Android 4.0上运行并且不使用Google Drive SDK,因为它不能让我们的程序读取Google Drive上不是由我们的程序创建的文件。我使用 com.google.api.services.drive.* 和 com.google.api.client.googleapis.auth.oauth2.* Java 库。

出现这个问题的代码如下:

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


GoogleTokenResponse response = null;
try {
    response = flow.newTokenRequest(authorizationCode).setRedirectUri(REDIRECT_URI).execute();
} catch (IOException e) {
    e.printStackTrace();
}

GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response);

但如果参数设置为 setAccessType("online"); 则上述代码运行良好

这个问题的解决方法取决于你想要什么样的 accessType。

如果你想要“onLine”作为accessType,那么使用setFromTokenResponse()应该没问题。

如果你想“离线”作为访问类型,那么你需要使用打击代码:

GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport)
        .setJsonFactory(jsonFactory)
        .setClientSecrets(CLIENT_ID, CLIENT_SECRET)
        .build()
        .setFromTokenResponse(response);

需要提到的一点是,您需要保持 accessType 设置与 GoogleTokenResponse 和 GoogleAuthorizationCodeFlow 创建一致。

【讨论】:

    【解决方案2】:

    您需要在Google Dev Console 中设置您的Android 应用密钥。

    1. 选择您的项目,选择 API & Auth,然后点击凭据
    2. 创建新的客户端 ID(尽管它有其他客户端 ID)
    3. 选择已安装的应用程序 -> android
    4. 正确填写你的包名和SHA1
    5. 创建新密钥(尽管它有其他客户端密钥)
    6. 选择安卓键
    7. 填写 SHA1;packageName 像这样:45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.example

    您的问题将自动解决。请务必使用您的调试密钥库和发布密钥库创建客户端 ID 和密钥。

    【讨论】:

      【解决方案3】:

      查看 Google Drive SDK 文档中的 Android 快速入门示例,了解正确设置 GoogleCredential 的分步说明:

      https://developers.google.com/drive/quickstart-android

      【讨论】:

      • 那使用GoogleAccountCredential,这是用户在手机上的账户。我想使用常规驱动器创建一个应用程序管理的帐户,如下所述:developers.google.com/drive/… 我得到了一个身份验证令牌和一个刷新令牌,现在无法从他们那里创建一个 Credential
      • 事实上GoogleCredential并没有出现在那个页面上根本,只是GoogleAccountCredential
      • 然后,您可以查看 Java 快速入门:developers.google.com/drive/quickstart-java
      • 这需要一个客户端密码,并且已安装的 Google API 应用(如 Android 应用)不再有客户端密码。
      • 另一个无用的仅链接答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2019-08-21
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多