跨项目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
相关产品推荐
相关产品推荐

