【问题标题】:Irritating Google API Client (Java) Issues恼人的 Google API 客户端 (Java) 问题
【发布时间】:2018-11-06 09:47:42
【问题描述】:

所以我所做的需要我使用 google sheet api 打一个文档,抓取一张表,从中提取数据,然后生成另一张表。因此,最初我使用服务帐户的示例如下:

@Bean(name = "google-creds")
@DependsOn(value = {"google-http-transport", "google-data-store", "json-factory"})
public GoogleCredential authorize(HttpTransport transport, JsonFactory factory) throws Exception {
    // Load client secrets.
    InputStream in = new FileInputStream(new File("config/oauth.json"));
    return GoogleCredential.fromStream(in, transport, factory).createScoped(SCOPES);
}

我的 oauth.json 文件正在使用 API 控制台凭据选项卡中生成的 json 文件。我按照指示生成了一个服务帐户...我有点怀疑。

我能够从我想要的文档中提取数据,并且能够创建另一个文档。但是据我所知,无法查看使用服务帐户创建的文档。哪个...我的意思是这使它完全无用。如果有一种方法可以让我从主帐户中查看这些文档,那么创建服务帐户就太棒了。然而,一些谷歌的答案似乎暗示这是不可能的。

好吧,我决定如何尝试使用主帐户中的客户 ID。我下载了提供的 json 文件,但它出错并显示未知字段“类型”。所以..我猜它使用来自 gson 的 RuntimeTypeAdapter 或其他东西进行序列化。所以它与主账户的凭证格式完全不兼容。

所以接下来我尝试这样做

    @Bean(name = "google-creds")
    @DependsOn(value = {"google-http-transport", "google-data-store"})
    public Credential authorize(HttpTransport transport) throws Exception {
        // Load client secrets.
        InputStream in = new FileInputStream(new File("config/oauthnew.json"));
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new InputStreamReader(in));
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(transport, factory, clientSecrets, SCOPES)
                .setDataStoreFactory(new MemoryDataStoreFactory()).build();
        Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
        return credential;
    }

所以我并没有真正读到这个,结果它创建了一个本地码头服务器......一些莫名其妙的原因。它还要求我去访问一个 URL,然后它会抱怨重定向。我不想进行任何类型的重定向,或者......除了解析和制作该死的电子表格之外的任何东西。如果需要已经对帐户进行身份验证,那么访问 URL 也已经是一个交易破坏者。这需要每 10 分钟左右以编程方式运行一次。

此外,当我使用上面的示例时,我找不到任何地方可以以任何形式或形式配置共享或权限。 Google 通常有很好的 API,但这是我在近十年的 Java 开发中使用过的最烦人的 API。我只需要能够 A) 解析工作表 A B) 必要时创建工作表 B 并且 C) 能够查看工作表 B

谁能给我指出一个不会让我对着显示器尖叫的方向?

【问题讨论】:

  • 因此,快速回顾一下,您的操作方式使服务帐户成为新创建工作表的所有者。不过,我不是 100% 确定您所说的主帐户是什么意思。另外,这里涉及 G Suite 还是我们谈论的是“普通”的 Google 帐户?
  • @noogui 不正确我已经做了那个人想做的事情。我的目标完全不同。我什至给出了 3 个要求(A、B、C)来说明这一事实。 EdoAkse 我正在使用一个普通的谷歌帐户,并试图在该帐户上查看一个电子表格,并创建另一个可以查看的电子表格。我已经尝试过 oAuth2 方法,但我不知道如何在服务器上为我的帐户授权应用程序。所以我要么需要可访问的服务帐户文档,要么需要无头的 oAuth。
  • 所以,在这种情况下,我看到了 2 个选项。一种是使用服务帐户创建工作表,并以编程方式将访问工作表的权限授予用户帐户。缺点是服务帐户将成为工作表的所有者,以及它的所有含义。不过之后你可以transfer ownership
  • 另一种方法是执行 OAuth2 流程,您可以在其中授予对 web 应用程序工作表的访问权限并存储创建的凭据。然后,您可以使用存储的凭据创建用户帐户拥有的文件。这意味着首先您必须执行 OAuth2 流程来获取凭据,将它们保存在某处,然后将存储的凭据用于进一步的操作(例如创建新工作表)。有一个可用于 Java 的库,从头到尾解释了整个过程here

标签: java google-app-engine google-sheets google-sheets-api google-api-java-client


【解决方案1】:

服务帐户用于以编程方式访问用户日期,它没有自己的文档/驱动器。您需要在创建 GoogleCredential 时提供用户的电子邮件地址。服务帐户将访问所需的用户文档(假设它启用了域范围的委派)。目前来自Stream的GoogleCredentials存在一个未解决的问题,请查看(解决它)https://github.com/google/google-api-java-client/issues/1007#issuecomment-318493967

如果用户帐户是 gsuite 帐户,您可以通过 Google 管理控制台 https://admin.google.com/ 向服务帐户授予范围权限

有关域范围委派和授予访问权限的详细信息,请查看https://developers.google.com/admin-sdk/directory/v1/guides/delegation

要查看由具有域范围委派的服务帐户创建的文档,您必须使用用户帐户访问它。

现在,如果您可以通过 Google 管理控制台授予对帐户的访问权限,则必须使用流程(您的第二种方法)。不幸的是,这将要求您必须通过提供的 url 授予文档权限。一旦授予权限,您就可以存储令牌,这样就无需重复此过程。

【讨论】:

    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2013-03-05
    • 2017-05-13
    • 2013-11-07
    • 1970-01-01
    相关资源
    最近更新 更多