在没有现有客户端库的情况下调用经过身份验证的谷歌云API

问题描述 投票:0回答:1

我正在尝试在 GCP Marketplace 上部署应用程序,但我很难理解身份验证文档。根据文档,需要

https://www.googleapis.com/auth/cloud-platform
的 OAuth 范围以及指向身份验证文档的链接,但是这些文档只是告诉您“使用其中一个客户端库”

我尝试使用的 API 是合作伙伴采购 API,虽然

@google-cloud/procurement
处存在 Node.js 客户端,但文档中与权利和帐户相关的绝大多数方法都没有作为方法公开,仅与似乎是某种遗留“订单”系统的功能相关。 我也不确定它是否是正确的客户端库,因为在检查了它的源代码后,我可以看到API主机是
cloudcommerceconsumerprocurement.googleapis.com
而不是
cloudcommerceprocurement.googleapis.com

以下是我想调用的API: https://cloud.google.com/marketplace/docs/partners/commerce-procurement-api/reference/rest/v1/providers.entitlements

如何从 Google Cloud Run 服务调用这些 API?有什么方法可以使用

google-gax
通过身份验证调用这些 API 端点吗?通常,对于客户端库,一切都“正常工作”,这要归功于它们在 GCP 中运行时从环境变量中读取身份验证

node.js typescript google-cloud-platform
1个回答
0
投票

请接受以下注意事项:

  1. 我不是 Node.JS 开发者
  2. 我正在使用 Cloud Shell 编写 Node.JS(错过了很多开发工具)
  3. 我无权访问您正在使用的服务(我使用过 Cloud Run)。

所有这些说明,以下内容应该适合您(进行一些调整)。

package.json

{
  "name": "78392854",
  "version": "0.0.1",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {
    "google-auth-library": "^9.9.0",
    "googleapis": "^135.0.0"
  }
}

如果您在本地运行,则可以使用

gcloud auth application-default login
创建 应用程序默认凭据 (ADC)

如果您在云平台上运行,ADC 会自动执行,但您需要创建一个服务帐户(见下文)和/或创建一个特定的服务帐户。无论哪种方式,您都需要确定要使用哪个 IAM 角色

我不知道该服务需要哪些 IAM 角色(请参阅 IAM 角色

PROJECT="..."
ACCOUNT="..."
ROLE="..."

gcloud iam service-accounts create ${ACCOUNT} \
--project=${PROJECT}

EMAIL=$(ACCOUNT}@${PROJECT}.iam.gserviceaccount.com

gcloud iam service-accounts keys create \
${PWD}/${ACCOUNT}.json \
--iam-account=${EMAIL}

gcloud projects add-iam-policy-binding ${PROJECT} --member=serviceAccount:${EMAIL} \
--role=${ROLE}

export GOOGLE_APPLICATION_CREDENTIALS=${PWD}/${ACCOUNT}.json

这是一个大纲(!)应用程序:

index.js

const { google } = require("googleapis");
const { GoogleAuth } = require("google-auth-library");

const discoveryUrl = "https://cloudcommerceprocurement.googleapis.com/$discovery/rest?version=v1";

// Unsure what you need to provide here or whether "provides/*" will work
// This "parent" property changes by the method used
// GET https://cloudcommerceprocurement.googleapis.com/v1/{parent=providers/*}/accounts
const parent = `providers/*`;

async function main() {
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/cloud-platform'
  });

  const discovery = await google.discoverAPI(discoveryUrl,{ auth });

  // https://cloud.google.com/marketplace/docs/partners/commerce-procurement-api/reference/rest/v1/providers.accounts/list
  const response = await discovery.providers.accounts.list({
    parent: parent,
  });

  console.log(response);
}

main();

© www.soinside.com 2019 - 2024. All rights reserved.