当前位置: 首页 > 知识库问答 >
问题:

Google云平台-云功能API-401未经授权

堵存
2023-03-14
    null
private String getAuthToken() {
  File credentialsPath = new File(PATH_TO_JSON_KEY_FILE);

  GoogleCredentials credentials;
  try (FileInputStream serviceAccountStream = new FileInputStream(credentialsPath)) {
    credentials = ServiceAccountCredentials.fromStream(serviceAccountStream);
    return credentials
           .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"))
           .refreshAccessToken()
           .getTokenValue();
  } catch (IOException e) {
    throw new RuntimeException("Action could not be performed");
  }
}
    null
public <Payload, Response> ResponseEntity<Response> callCloudFunction(
    String endpoint,
    Payload payload,
    Class<Response> klazz
) {
  RestTemplate restTemplate = new RestTemplate();
  HttpHeaders headers = new HttpHeaders();
  headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
  headers.setContentType(MediaType.APPLICATION_JSON);
  String url = gCloudUrl + endpoint;
  String token = getAuthToken();
  String payloadString = null;

  if (payload != null) {
    try {
      ObjectMapper objectMapper = new ObjectMapper();
      payloadString = objectMapper.writeValueAsString(payload);
    } catch (JsonProcessingException e) {
      System.out.println(e.getMessage());
      throw new RuntimeException("Could not perform action");
    }
  }

  headers.add("Authorization", String.format("Bearer %s", token));
  HttpEntity<String> entity = new HttpEntity<>(payloadString, headers);

  return restTemplate.exchange(url, HttpMethod.POST, entity, klazz);
}

不幸的是,GCP文档并没有真正的帮助。我想我已经找遍了所有可能的地方。

共有1个答案

赵晟睿
2023-03-14

首先,同意,还不清楚……

然后,您必须知道(现在还不清楚)您需要访问令牌来调用Google Cloud API,但需要身份令牌来调用IAP(例如在App Engine上)或私有云函数和云运行。和这个身份令牌需要由谷歌签署。

而且,正如代码中提到的,您需要在计算机上有一个服务帐户,但我建议您在GCP上避免这样做,如果您使用默认身份验证,就不需要这样做(请参见我的代码,在您的计算机上设置Google_Application_Credentialsenv var,它指向服务帐户密钥文件)。最好的方法是不要在你的电脑上使用服务帐户密钥文件,但这还不可能(这是一个安全问题,我正在与谷歌讨论这个...)

  String myUri = "https://path/to/url";
  // You can use here your service account key file. But, on GCP you don't require a service account key file.
  // However, on your computer, you require one because you need and identity token and you can generate it with your user account (long story... I'm still in discussion with Google about this point...)
  Credentials credentials = GoogleCredentials.getApplicationDefault().createScoped("https://www.googleapis.com/auth/cloud-platform");
  IdTokenCredentials idTokenCredentials = IdTokenCredentials.newBuilder()
    .setIdTokenProvider((IdTokenProvider) credentials)
    .setTargetAudience(myUri).build();

  HttpRequestFactory factory = new NetHttpTransport().createRequestFactory(new HttpCredentialsAdapter(idTokenCredentials));

  HttpRequest request = factory.buildGetRequest(new GenericUrl(myUri));
  HttpResponse httpResponse = request.execute();
  System.out.println(CharStreams.toString(new InputStreamReader(httpResponse.getContent(), Charsets.UTF_8)));
  String token = ((IdTokenProvider) credentials).idTokenWithAudience(myUri, Collections.EMPTY_LIST).getTokenValue();
  System.out.println(token);
 类似资料:
  • 我正在与谷歌云平台合作。学习和尝试一些东西,比如Bigquery和Google云存储。 我感到困惑的是,所有这些东西都有两个官方API:gcloud API和Google API Python客户端。在google Cloud的“入门”教程中,推荐的API是,gcloud API的文档似乎不是很详细。 简而言之,要以编程方式访问Google云平台, null

  • 我正在做关于口头证词转录的情感分析的论文,对于Google Cloud的自然语言API V1Beta2背后的编程有几个问题/澄清。 我对任何答案都持开放态度。此外,如果任何人知道任何官方的谷歌文件列出了这些信息,也将非常感谢。谢谢你。

  • 对于这个问题,这里可能是错误的地方,所以如果有必要,请重新指示我。 我使用Google Cloud函数部署了几个简单的函数,它们可以实现以下功能: 从AWS读取文件并写入云SQL 我将这些函数作为单独的函数,因为(1)通常需要比云函数最大超时更长的时间。正因为如此,我正在考虑将这一切作为一项服务转移到App Engine。关于应用程序引擎标准,我的问题是: 请求超时是什么意思?如果我运行这个服务,

  • 我正在尝试在Android设备上使用一个简单的电话差距应用程序。因此,我遵循了所有步骤,创建了一个项目,该应用程序成功地与GCM服务器通信,并使用我的项目编号获取注册ID。 问题是我不能从服务器端与GCM通信。我最初是在Perl中这样做的,但是即使是GCM文档中的curl example也返回“401”。 他们的API访问密钥被列入了白名单,我试着删除它并创建新的几次。甚至尝试使用浏览器密钥而不是

  • 我已经创建了一个Google云平台服务帐户,,具有存储管理员()角色。 现在,我希望限制此帐户,使其只能访问特定的谷歌云存储(GCS)存储桶()。 现在的问题是,可以访问所有GCS存储桶。我无法从其他GCS存储桶中删除,因为被继承。 那我该怎么办?

  • 因此,你对以下方面有何建议: 为了使功能更有效,我应该更改哪些功能? 使我的函数自动化以便每小时运行一次的另一种方法? FYI my cloud功能具有以下特点: null