使用 cURL 使用 JSON 密钥文件进行 Google Cloud 身份验证

API*_*API 8 curl oauth google-oauth google-cloud-platform gcloud

我有一个 Google Cloud 的 JSON 密钥文件,格式如下:

{
  "type": "service_account",
  "project_id": "###",
  "private_key_id": "###",
  "private_key": "-----BEGIN PRIVATE KEY-----\n
  ########################################
  \n-----END PRIVATE KEY-----\n",
  "client_email": "###@###.gserviceaccount.com",
  "client_id": "###",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/###.gserviceaccount.com"
}
Run Code Online (Sandbox Code Playgroud)

我想access_token使用常规 curl 命令而不是GCP Console或安装gcloud 工具来获得一段时间。

我希望是这样的:

{
  "type": "service_account",
  "project_id": "###",
  "private_key_id": "###",
  "private_key": "-----BEGIN PRIVATE KEY-----\n
  ########################################
  \n-----END PRIVATE KEY-----\n",
  "client_email": "###@###.gserviceaccount.com",
  "client_id": "###",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/###.gserviceaccount.com"
}
Run Code Online (Sandbox Code Playgroud)

Coo*_*J86 5

卷曲是不够的

我认为你不能只用curl,因为我相信它需要 JWT 身份验证 - 在文档中的行和我自己得到的错误消息之间阅读。

oauth2l:一种轻量级的方法

他们有oauth2l,它可以从service_account.jsonJWK生成 JWT (尽管它也应该与使用 PEM 或 CRT 的那个一起工作)。

不幸的是,他们没有直接的下载链接,但它不是难以得到:

尝试这个:

安装去:

然后安装oauth2l

go get github.com/google/oauth2l
go install github.com/google/oauth2l
Run Code Online (Sandbox Code Playgroud)

然后生成一个 JWT API Token:

oauth2l fetch --jwt --json ./service_account.json https://www.googleapis.com/auth/cloud-platform
Run Code Online (Sandbox Code Playgroud)

回到卷曲

然后使用curl来获取你想要的 API:

token=$(oauth2l fetch --jwt --json ./service_account.json https://www.googleapis.com/auth/cloud-platform)

curl -X POST https://www.googleapis.com/dns/v1/projects/<project>/managedZones \
  -H "Authorization: Bearer $token"
Run Code Online (Sandbox Code Playgroud)

这并不理想,但我认为这会以最少的抽象为您提供所需的东西。

更少的抽象

当我弄清楚这一点时,我会尝试回帖。它需要某种工具,但我认为它甚至可以比oauth2l.