我设置Google SDK使用Google API与应用程序默认凭证。对于我的本地机器,创建一个凭据json文件,并将其路径设置为GOOGLE_APPLICATION_CREDENTIALS
作为环境变量。
然而,当应用程序部署到Google Cloud VM时,它抛出以下错误:
[Google_Service_Exception]
{
"error": {
"code": 403,
"message": "Request had insufficient authentication scopes.",
"errors": [
{
"message": "Request had insufficient authentication scopes.",
"domain": "global",
"reason": "forbidden"
}
],
"status": "PERMISSION_DENIED"
}
}
根据文档,内置服务帐户应该与虚拟机实例相关联。为了使其工作,我尝试使用凭证json文件,因为我在本地机器上(工作得很好),但它也不起作用。
要注意,错误消息是关于作用域的,而不是权限问题。如何使其在计算引擎VM实例上工作?
给出客户端初始化代码:
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->addScope(Google_Service_Pubsub::PUBSUB);
更新
现在支持了。你必须通过stop实例来改变API的作用域。https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances changeserviceaccountandscopes
原始回答
事实证明,我必须在Google Cloud Console上为虚拟机实例详细信息的服务启用云API访问范围:https://console.cloud.google.com/compute/instances
不幸的是,我不能改变它,因为谷歌云目前不支持它。我必须启动一个新实例来启用服务API访问。https://googlecloudplatform.uservoice.com/forums/302595-compute-engine/suggestions/13101552-ability-to-change-cloud-api-access-scopes-on-launc
现在是可能的。您的实例必须停止,然后它可以从编辑vm页面的控制台更改其作用域列表,或者在SDK中使用:
gcloud compute instances stop [vmname]
gcloud beta compute instances set-scopes [vmname] --scopes="[scopes list]"
请注意,使用SDK方式,第二个命令将使用列表中的作用域重置。仅追加新作用域的功能目前不可用。