使用GCP PubSub REST API+API Key遇PERMISSION_DENIED的调试方法
你遇到的问题是API Key调用PubSub Publish接口返回权限拒绝,但服务账号OAuth2正常,核心原因是API Key和服务账号的权限验证逻辑不同——API Key仅验证项目归属和API启用状态,而PubSub的Topic访问权限需要额外配置,且API Key本身不携带身份信息,需确保对应的访问路径和权限策略允许API Key的请求。以下是具体调试步骤:
确认API Key与项目的关联关系
登录GCP控制台,进入「API和服务」→「凭据」页面,找到你的API Key,检查其「关联项目」是否为myproject。如果API Key属于其他项目,即使Topic在myproject,也会因项目不匹配触发权限拒绝。检查Cloud Pub/Sub API是否启用
在GCP控制台的「API库」中搜索「Cloud Pub/Sub API」,确认该API在myproject中处于启用状态。API Key仅能调用已启用的API,未启用时会直接返回403或404错误。验证API Key的限制配置
查看API Key的「限制」设置:- 若设置了应用限制(如IP地址限制、HTTP引用者限制),需确保发起curl请求的IP地址在允许列表内,或请求的Referrer符合规则;
- 若设置了API限制,需确认「Cloud Pub/Sub API」已添加到允许的API列表中,且未遗漏
pubsub.topics.publish对应的API路径。
配置Topic的IAM权限以允许API Key访问
API Key调用PubSub接口时,请求身份为匿名用户(allUsers),因此需要给目标Topic的IAM策略添加权限:- 进入GCP控制台的「Pub/Sub」→「主题」页面,找到
mytopic; - 点击「权限」→「添加权限」;
- 主体选择
allUsers,角色选择「Pub/Sub Publisher」;
注意:若需更严格的控制,可结合API Key的IP限制,避免公开所有用户访问。
- 进入GCP控制台的「Pub/Sub」→「主题」页面,找到
测试合法的请求体格式
虽然当前错误是权限问题,但空的messages数组可能不符合接口要求,可替换为包含有效base64编码数据的请求体测试:curl --request POST 'https://pubsub.googleapis.com/v1/projects/myproject/topics/mytopic:publish?key=[API_KEY]' --header 'Content-Type: application/json' --data '{"messages":[{"data":"SGVsbG8gUHVic3Vi"}]}'检查API Key是否被禁用
在GCP控制台的凭据页面,确认你的API Key状态为「启用」,若被禁用会直接触发权限拒绝。
内容的提问来源于stack exchange,提问作者galah92

