向 Google Cloud Function 发出经过身份验证的请求

Making authenticated request to Google Cloud Function

我有 Google 云功能,可以在 https://us-central1-project.cloudfunctions.net/update 上访问 我还有角色为 'Invoke Google Cloud Function'

的服务帐户

首先,我需要验证请求,为此我使用 https://github.com/googleapis/google-auth-library-ruby

我已经为我的服务帐户创建了google_cloud.json,我正在做

credentials = Google::Auth::ServiceAccountJwtHeaderCredentials.make_creds({json_key_io: File.open('./config/google_cloud.json'), scope: 'https://www.googleapis.com/auth/
cloud-platform'})
headers = {}
credentials.apply(headers)

输出看起来像

{:authorization=>"Bearer ENCODED_TOKEN"} 

那我在做

curl -X POST -H "Authorization: Bearer ENCODED_TOKEN" -H 'Content-Type: application/json' -d '{"data":["user1"]}' "https://us-central1-project.cloudfunctions.net/update"

它 return HTML 和

<h2>Your client does not have permission to the requested URL <code>/update_statuses</code>.</h2>

如果我有一个 VPS 服务器应该向 Google Cloud Function 发送 API 请求,我应该如何授权它?

如@DazWilkin 所述,通过 运行 gcloud auth print-identity-token 启用服务帐户然后获取身份令牌,您可以 gcloud auth print-identity-token --account=${ACCOUNT} 其中 ACCOUNT 是电子邮件地址服务帐户。

详情可参考official documentation

我终于明白了。问题中的代码应该用于获取 Access Token,但是为了调用 Google Cloud Functions,我需要 ID Token。为此,我们需要将函数 url 作为 target_audience

传递,而不是 scope
google_url = 'https://us-central1-project.cloudfunctions.net/update'
path = File.join(__dir__, '../config/google_cloud.json')
authorizer = Google::Auth::ServiceAccountCredentials.make_creds(json_key_io: File.open(path), target_audience: google_url)
token = authorizer.apply({})[:authorization]