【问题标题】:Error 403: Error sending test message to Cloud PubSub: User not authorized to perform this action错误 403:向 Cloud PubSub 发送测试消息时出错:用户无权执行此操作
【发布时间】:2025-12-15 14:55:01
【问题描述】:

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

请求:

// 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
  • 订阅和主题存在并且它们是在同一个控制台中创建的。
  • 我尝试从控制台发布一条新消息,它成功了。

【问题讨论】:

    标签: php push-notification gmail gmail-api google-cloud-pubsub


    【解决方案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的角色并保存。