使用Google Sheets API从Java使用GKE工作负载标识



我们已经在GKE集群中成功地使用Google Sheets的Java客户端一段时间了,使用ComputeCredential类来提供凭据。下面的代码或多或少就是我们正在做的:

import com.google.api.client.googleapis.compute.ComputeCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.sheets.v4.Sheets;
NetHttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
GsonFactory jsonFactory = GsonFactory.getDefaultInstance();
ComputeCredential credential = new ComputeCredential(transport, jsonFactory);
Sheets service = new Sheets.Builder(transport, jsonFactory, credential)
.setApplicationName("myApplication")
.build();

我们最近在我们的集群上启用了Workload Identity,这个集成不再工作——我们得到一个403,消息是ACCESS_TOKEN_SCOPE_INSUFFICIENT。我认为这是因为默认作用域包含Google Cloud api,不允许您指定所需的Google Sheets作用域。

我在Google -auth-library-oauth2-http中找到了ComputeEngineCredentials类,它允许传入范围,但与Google Sheets库不兼容。

我已经提出了一个GitHub问题,但还没有回复。

有没有人知道如何使用工作负载身份的谷歌表库?

oAuth2流程需要用户交互-为服务器端使用服务帐户。

我终于想出了解决办法!对于其他想知道的人,您可以编辑ComputeCredential对象上的令牌服务器URL以包含范围,如下所示:

import com.google.api.client.googleapis.compute.ComputeCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.sheets.v4.Sheets;
NetHttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
GsonFactory jsonFactory = GsonFactory.getDefaultInstance();
ComputeCredential.Builder builder = new ComputeCredential.Builder(transport, jsonFactory);
GenericUrl url = builder.getTokenServerUrl().clone().set("scopes", "<your scopes here>");
ComputeCredential credential = builder.setTokenServerUrl(url).build();
Sheets service = new Sheets.Builder(transport, jsonFactory, credential)
.setApplicationName("myApplication")
.build();

最新更新