Actions Builder发送推送返回403调用者无权限错误如何解决
问题说明
我正在尝试基于Actions Builder构建可向自身发送推送通知的bot,已正确配置意图、获取push token,且完全按照官方文档方案实现代码。
我的代码如下:
action.handle('SendPushIntent', async (conv) => { const serviceAccount = require('./service-account.json'); console.log(serviceAccount.client_email); // 已验证此处的服务账号与我的GCP账号一致 let client = auth.fromJSON(serviceAccount); client.scopes = ['https://www.googleapis.com/auth/actions.fulfillment.conversation']; let notification = { userNotification: { title: 'Example', text: 'Body' }, target: { userId: conv.user.params.pushToken, // 已验证存储的push token不为空、null或undefined intent: 'PushReceptorIntent', locale: conv.user.locale, }, }; client.authorize((err, tokens) => { if (err) { throw new Error(`Auth error: ${err}`); // 此处未抛出鉴权错误 } request.post('https://actions.googleapis.com/v2/conversations:send', { 'auth': { 'bearer': tokens.access_token, }, 'json': true, 'body': {'customPushMessage': notification, 'isInSandbox': true}, }, (err, httpResponse, body) => { if (err) { throw new Error(`API request error: ${err}`); } console.log(`${httpResponse.statusCode}: ` + `${httpResponse.statusMessage}`); console.log(JSON.stringify(body)); }); }); });
触发推送时收到如下错误:{"error":{"code":403,"message":"The caller does not have permission","status":"PERMISSION_DENIED"}}
我已经按照官方文档要求生成了具备所有者权限的服务账号密钥并引入代码中,Actions API调用统计显示所有请求均返回403错误,暂时无法定位问题原因。
已尝试的排查步骤:
- 禁用后重新启用Actions API
- 重新生成服务账号
- 验证服务账号确实具备所有者权限
10月8日补充
已为服务账号添加了Cloud Asset Owner权限。
解决方案
- 校验推送意图配置
确认你代码中指定的PushReceptorIntent已经在Actions Console的「参与>通知」页面完成注册,且该意图设置为允许用户显式调用,未设置调用限制。 - 核对项目匹配关系
确认你使用的服务账号属于当前Actions Builder绑定的GCP项目,可在Actions Console的项目设置页面查看绑定的GCP项目ID,再到GCP控制台IAM页面核对服务账号的所属项目是否一致,跨项目的服务账号即使有高权限也无法调用当前项目的Actions推送接口。 - 调整沙箱参数配置
如果你的Action已经发布到正式环境,将请求体中的isInSandbox参数修改为false;如果仍在测试阶段,确认接收推送的用户账号已经添加到Action的测试用户列表中,未加入列表的用户无法接收沙箱环境的推送。 - 刷新后台权限配置
在Actions Console的通知设置页面先关闭通知功能,等待5分钟后再重新开启,触发后台权限规则重新同步。 - 校验push token有效性
确认你使用的push token是用户主动触发推送授权流程后返回的最新有效token,避免使用过期的历史存储token导致权限校验失败。
内容的提问来源于stack exchange,提问作者Lalox
相关产品推荐
相关产品推荐

