【发布时间】: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