首页 > 解决方案 > 谷歌云如何使用 php 通过服务帐户获取 ID 令牌

问题描述

我创建了一个服务帐户,为其创建了密钥并存储为 JSON 文件(包括roles/cloudfunctions.invoker角色),保存在本地。并且有一些代码试图在 GCP 上调用 Cloud Functions。

我成功测试通过在本地调用我的函数curl

curl -X POST  -H "Authorization: bearer $(gcloud auth print-identity-token)" -H "Content-Type:application/json" -d '{"data" : {"id" : "121123"}}' "https://asia-northeast1-my-project-name.cloudfunctions.net/MyFunction"

现在我想在我的本地服务器上调用此函数,但不想安装具有“gcloud”命令的 Cloud SDK(因为 gcloud auth 需要通过浏览器进行身份验证)。我将上面的 JSON 文件复制到此服务器的本地,并尝试使用Google APIs Client Library for PHP生成相当于 command 的 ID Token gcloud auth print-identity-token。我也提到了这个答案

require __DIR__ . '/vendor/autoload.php';

$client = new Google_Client();
$client->setAuthConfig('/path/to/json/file.json');
$client->useApplicationDefaultCredentials();
$client->addScope('https://www.googleapis.com/auth/cloud-platform');
$client->fetchAccessTokenWithAssertion();
$access_token = $client->getAccessToken();
var_dump($access_token);

如果我在这里有一个有效的令牌,我可以调用我的云函数,但是当 var_dump 这个 $access_token 时,它会打印出一个奇怪的字符串(最后有很多“点”) - 看起来像这样:

ab29.c.Kp4BDgaiwej12ckskW0waSinDiMRcayZoBm5tp1lvc2813uEZjraVbU-4hKXxG2euqNS9wxRUa1aEKOH7n5w_VAhIUW9821Cy7Ca0c7_sXVDr_Nwouj8sVZR6gnjUFx51n8azUTX-RFMJBGE4_MrPT3hIMYYeBlIxy_IEUHF932xKPWR0ulf-wOa0o...............................................................................................................................................................................................................................................................................................................................................................................................

当然不能使用这个access_token。

我上面的步骤有什么问题?如果这种方式无法完成,您能否建议一种允许我在本地服务器上调用 Cloud Functions 的方式?

标签: phpgoogle-cloud-functionsgoogle-authentication

解决方案


推荐阅读