gmail.users.watch 无法使用 DwD 服务帐户向 PubSub 发送测试消息

Posted

技术标签:

【中文标题】gmail.users.watch 无法使用 DwD 服务帐户向 PubSub 发送测试消息【英文标题】:gmail.users.watch fails to send test message to PubSub with a DwD service account 【发布时间】:2017-09-17 10:07:16 【问题描述】:

我正在尝试设置 gmail.users.watch 但收到 403 错误:

Error sending test message to Cloud PubSub projects/project-id/topics/topic-id : User not authorized to perform this action.

使用GOOGLE_APPLICATION_CREDENTIALS 方法和下载的凭据 json 文件进行身份验证。

以下代码可以正常工作,这支持了我的假设,即身份验证通常有效:

const pubsub = PubSub();
const topic = pubsub.topic('topic-id');
const subscription = pubsub.subscription('subscription-id');
topic.exists()
  .then(data => 
    console.log(data);
    return subscription.exists();
  )
  .then(data => 
    console.log(data);
    return subscription.pull()
  )
  .then(data => 
    data[1].receivedMessages.forEach(d => console.log(d));
    return topic.publish('Hello, world!');
  )
  .then(data => 
    console.log(data)
  )
  .catch(err => console.log(err));

该代码没有错误。但是下面的代码会抛出上述的 403 错误:

const authParams = 
  subject: userId,
  scopes: [
    'https://mail.google.com/',
    'https://www.googleapis.com/auth/pubsub'
  ]
;

gauth.getAuth(authParams)
  .then(authClient => 
    const params = 
      auth: authClient,
      userId: 'me',
      resource: 
        topicName: <topic-id>
      
    ;

    return new Promise((resolve, reject) => 
      gmail.users.watch(params, (err, response) => 
        if (err) 
          console.log(err);
          reject(err);
          return;
        
        resolve(response);
      );
    );
  )
  .then(response => 
    console.log(response);
  );

gauth.getAuthgetApplicationDefaultGoogle Auth Library for Node.js 的简单包装器。

G Suite 域安全客户端访问权限是使用服务帐号的客户端 ID 针对所需范围配置的: https://www.googleapis.com/auth/pubsub, https://mail.google.com/

由于本地云 pub/sub 工作正常,我认为服务帐户在控制台上配置了所有正确的权限,所以我对 gmail 调用失败的原因有点茫然。

更新: 服务帐号在 Google Cloud Console 上具有以下权限:

项目:(对于 gmail 的东西,它还需要更多吗?)

服务帐户参与者 PubSub 管理员

主题:

所有者

订阅:

所有者

在进行 gmail 调用时,服务帐户正在委派一个“主题”。我已将该主题 userId 的权限添加到 Google Cloud Console:

项目:

所有者

主题:

所有者

订阅:

所有者

【问题讨论】:

我认为这与service account 角色有关。转到 Google Dev Console 并将服务帐户角色设置为管理员或所有者 - 具有***权限的用户角色。 是的,我想我已经做到了。服务帐户在项目级别具有 PubSub Admin 和 Service Account Actor。 它也有主题和订阅的所有者 【参考方案1】:

您需要添加权限,以便将消息发布到您的订阅。

转到 Google Cloud 控制台,选择订阅,然后选择权限。 在添加成员部分,输入 allAuthenticatedUsers,选择 Pub/Sub 发布者角色,然后单击 添加

有帮助吗?

更新(2017 年 5 月 9 日):

我正在编辑我的答案,以便更准确地了解需要什么。

根据Gmail API documentation(请参阅授予您主题的发布权部分):

需要在主题级别设置权限 会员是:serviceAccount:gmail-api-push@system.gserviceaccount.com 角色是:Pub/Sub Publisher

【讨论】:

服务帐号被添加为订阅和主题的所有者,不包括发布权限吗? 我遇到了同样的错误,将 allAuthenticatedUsers 添加到 Pub/Sub 发布者解决了这个问题。根据this,所有者角色应该可以工作。 太好了,我到办公室就试试看! allAuthenticatedUsers 使其可供公众访问。使用推荐的serviceAccount:gmail-api-push@system.gserviceaccount.com。为此,请转到添加成员(在权限选项卡中)并在新成员输入中输入 gmail-api-push@system.gserviceaccount.com,然后选择 Pub/Sub Publisher 的角色并保存。

以上是关于gmail.users.watch 无法使用 DwD 服务帐户向 PubSub 发送测试消息的主要内容,如果未能解决你的问题,请参考以下文章

gmail API 中的观看请求不起作用

Oralce11g:ORA-06153:表BI_DW.DW_NBZ_POLICY_MAIN无法通过8192(在表空间BIDW中) 扩展

程序无法启动,因为缺少 libgcc_s_dw2-1.dll

由于在 Code::Block 中缺少“libgcc_s_dw2-1.dll”,OpenCV 程序无法运行

如何修复其他计算机上的错误“其他计算机程序无法启动,因为您的计算机缺少libgcc_s_dw2-1.dll”[重复]

dw中用HTML如何将背景图片平铺?