You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨项目Pub/Sub推送认证功能疑似失效求助

跨项目Pub/Sub事件流推送认证问题解决

问题背景

我们架构里要把生产项目Pub/Sub的实时事件流推到隔离的非生产项目做测试。同账号内调用https://pubsub.googleapis.com/v1/projects/{project_id}/topics/{topic_id}:publish接口完全正常,但跨项目推送必须过认证,而且遇到了权限验证失败的问题。

已尝试的操作

  • 给生产项目默认的Pub/Sub托管服务账号,授予非生产主题的发布权限,没用
  • 专门在生产项目新建服务账号,配置了roles/iam.serviceAccountTokenCreator这类权限,还是失败

问题排查结果

查私有端点日志里的Bearer Token,用jwt.io解码后发现:

  • Pub/Sub自动生成的JWT里,sub字段是服务账号的OAuth2客户端ID
  • 但我自己用pyjwt生成的有效JWT,sub字段是服务账号的邮箱地址
  • 手动把自己生成的JWT的sub改成客户端ID后,直接报401,所以推测问题出在Pub/Sub生成的JWT的sub字段不符合权限校验要求,导致认证失败

临时 workaround

现在临时给非生产主题加了allAuthenticatedUsers的发布权限,测试完就删掉,但不想用Dataflow或者Cloud Function这类额外服务,希望用Pub/Sub原生功能解决。

正式解决方案

1. 修正权限配置的主体标识

如果非要用推送模式,首先得确保在非生产项目里,给生产项目的目标服务账号(用邮箱地址作为身份主体,别用客户端ID)授予roles/pubsub.publisher权限。之前失败大概率是权限主体配错了,或者用了错误的标识。

2. 用Pub/Sub跨项目订阅原生方案(更推荐)

其实没必要手动做推送,Pub/Sub本身支持跨项目订阅,完全是原生能力:

  • 在非生产项目里创建订阅,指定生产项目的主题,格式是projects/{生产项目ID}/topics/{主题ID}
  • 给非生产项目的订阅服务账号,授予生产项目主题的roles/pubsub.subscriber权限
  • 这样非生产项目的订阅可以直接拉取生产项目的事件流,全程不需要额外服务,也绕开了跨项目推送的认证坑

内容的提问来源于stack exchange,提问作者Michael Mellor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:36:10