我创建了一个服务帐户,为其创建了密钥并存储为 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"
Run Code Online (Sandbox Code Playgroud)
现在我想在我的本地服务器上调用此函数,但不想安装具有“gcloud”命令的Cloud SDK(因为gcloud auth需要通过浏览器进行身份验证)。我将上面的 JSON 文件复制到该服务器本地,并尝试使用适用于 PHP 的 Google API 客户端库来生成相当于 command 的 ID 令牌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);
Run Code Online (Sandbox Code Playgroud)
如果我在这里有一个有效的令牌,我可以调用我的云函数,但是当 var_dump 这个 $access_token 时,它打印出一个奇怪的字符串(末尾有很多“点”) - 看起来像这样:
ab29.c.Kp4BDgaiwej12ckskW0waSinDiMRcayZoBm5tp1lvc2813uEZjraVbU-4hKXxG2euqNS9wxRUa1aEKOH7n5w_VAhIUW9821Cy7Ca0c7_sXVDr_Nwouj8sVZR6gnjUFx51n8azUTX-RFMJBGE4_MrPT3hIMYYeBlIxy_IEUHF932xKPWR0ulf-wOa0o...............................................................................................................................................................................................................................................................................................................................................................................................
Run Code Online (Sandbox Code Playgroud)
当然这个access_token不能使用。
我上面的步骤有什么问题吗?如果这种方式无法完成,您能否建议一种允许我在本地服务器上调用云功能的方法?