错误 403:向 Cloud PubSub 发送测试消息时出错:用户无权执行此操作

Posted

技术标签:

【中文标题】错误 403:向 Cloud PubSub 发送测试消息时出错:用户无权执行此操作【英文标题】:Error 403: Error sending test message to Cloud PubSub: User not authorized to perform this action 【发布时间】:2018-02-18 09:12:41 【问题描述】:

我想设置推送通知手表,但收到错误响应。我需要什么授权?

请求:

// Google API
$client = getClient();

// POST request    
$ch = curl_init('https://www.googleapis.com/gmail/v1/users/me/watch');

curl_setopt_array($ch, array(
    CURLOPT_POST => TRUE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_HTTPHEADER => array(
        'Authorization: Bearer ' . $client->getAccessToken()['access_token'],
        'Content-Type: application/json'
    ),
    CURLOPT_POSTFIELDS => json_encode(array(
        'topicName' => 'projects/xxxx/topics/xxxx',
        'labelIds' => ["INBOX"]
    ))
));

回复:


 "error": 
  "errors": [
   
    "domain": "global",
    "reason": "forbidden",
    "message": "Error sending test message to Cloud PubSub projects/xxxx/topics/xxxx : User not authorized to perform this action."
   
  ],
  "code": 403,
  "message": "Error sending test message to Cloud PubSub projects/xxxx/topics/xxxx : User not authorized to perform this action."
 

更多细节:

使用的范围是GMAIL_READONLY。 订阅和主题存在并且它们是在同一个控制台中创建的。 我尝试从控制台发布一条新消息,它成功了。

【问题讨论】:

【参考方案1】:

来自页面:https://developers.google.com/gmail/api/guides/push#grant_publish_rights_on_your_topic

Cloud Pub/Sub 要求您授予 Gmail 权限才能发布 通知您的主题。

为此,您需要授予发布权限 服务帐户:gmail-api-push@system.gserviceaccount.com。你可以做 这使用 Cloud Pub/Sub Developer Console 权限界面 遵循资源级访问控制说明。

(强调)

【讨论】:

这个serviceAccount:gmail-api-push@system.gserviceaccount.com 用户是如何创建的?我没有它,但我也无法创建它。我假设 serviceAccount 应该被替换为某些东西,但我不确定那是什么。【参考方案2】:

您必须授予主题权限。 转到您的主题列表 或点击以下链接https://console.cloud.google.com/cloudpubsub/topic。

然后点击你的主题

然后在右侧的权限选项卡中,点击添加成员按钮

然后输入新成员的电子邮件或如果您的应用有多个用户,那么您可以输入allUsers。然后选择角色 Pub/Sub Publisher 并点击 Save 按钮。 注意:这将使您的主题公开。

【讨论】:

让所有用户都可以使用它是一种安全风险,对吧?我试过allAuthenticated users 还是不行。 添加到所有者附加角色Pub/Sub Admin 以解决安全问题。如果不想遇到安全问题,请不要添加AllUsersAllAuthorizedUsers【参考方案3】:

不要添加 allAuthenticatedUsersallUsers ,这会使您的主题公开。你可能已经看到了这个警告

此资源是公开的,互联网上的任何人都可以访问。 要删除公共访问权限,请删除“allUsers”和“allAuthenticatedUsers” 来自资源的成员。

所以不要这样做


改为添加gmail-api-push@system.gserviceaccount.com。这会奏效。 参考:https://developers.google.com/gmail/api/guides/push#grant_publish_rights_on_your_topic

【讨论】:

有效。转到添加成员并在新成员输入中输入gmail-api-push@system.gserviceaccount.com,然后选择Pub/Sub Publisher的角色并保存。

以上是关于错误 403:向 Cloud PubSub 发送测试消息时出错:用户无权执行此操作的主要内容,如果未能解决你的问题,请参考以下文章

gmail.users.watch 无法使用 DwD 服务帐户向 PubSub 发送测试消息

谷歌云运行/故障排除 pubsub 403

为 GCP IOT Core 和 PUB/SUB 运行 cloudiot_pubsub_example_server.py 代码时出现 403 错误

获取 google cloud pubsub 的指标

Google Cloud PubSub 在异步拉取消息时抛出 504 Deadline Exceeded 错误

如何使用 Node.js 控制 Cloud PubSub 中的确认