使用Google API时身份验证作用域不足



我设置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方式,第二个命令将使用列表中的作用域重置。仅追加新作用域的功能目前不可用。

相关内容

  • 没有找到相关文章

最新更新