【问题标题】:Gmail API "Delegation denied for email" error while reading delegating email from a superadmin account从超级管理员帐户读取委派电子邮件时,Gmail API“电子邮件的委派被拒绝”错误
【发布时间】:2020-09-01 04:18:33
【问题描述】:

我一直在尝试使用 google nodejs 库从我的 domail 中获取另一个用户的电子邮件,以便迁移它。我的帐户是超级管理员,我的 API 启用了具有以下范围的广域委派权限:

"https://www.googleapis.com/auth/apps.groups.migration",
"https://mail.google.com/",
"https://www.googleapis.com/auth/gmail.settings.sharing"

我已使用模拟访问权限登录 API

async function initializeGmail(emailToImpersonate) {
        const auth = await getAuth(emailToImpersonate);
        return google.gmail({
            version: 'v1',
            auth
        });
    }

    async function getAuth(emailToImpersonate) {
        const jwtClient = new google.auth.JWT(
            client_email,
            null,
            private_key,
            SCOPES,
            emailToImpersonate
        );
        await jwtClient.authorize();
        return jwtClient;
    }

我已在要迁移的帐户中添加授权许可,以便我可以从我的主帐户访问其电子邮件

const requestBody = {
        delegateEmail: user.email,
        verificationStatus: 'accepted'
}
await gmail.users.settings.delegates.create({userId, requestBody})

我请求迁移帐户的电子邮件,但出现以下错误

const gmail = await initializeGmail(userEmail);
const messages =  (await gmail.users.messages.list({auth, userId:userEmail})).data.messages;
code: 403,
errors: [
    {
      domain: 'global',
      reason: 'forbidden',
      message: 'Delegation denied for sysadmin@boatjump.com'
    }
]

任何帮助或想法将不胜感激

【问题讨论】:

  • delegate.Email user.email 是要迁移的账户邮箱还是你的主账户?
  • 我想将一个帐户委托给我的主帐户

标签: node.js gmail-api google-admin-sdk


【解决方案1】:

第一步 - 创建委托

  • 要创建代理,参数delegateEmail必须指定代理的主邮箱,也就是你的主账号,我假设sysadmin@boatjump.com
  • documentation 中所述,委托创建必须由模拟委托人的服务帐户执行(您的辅助帐户,我假设user.email

第二步 - 列出委托人的电子邮件

  • 验证为sysadmin@boatjump.co'(无需服务帐号)
  • 指定为userId user.email

您获得 403 错误的原因是您指定的事实 user.email 而不是 sysadmin@boatjump.com 作为代表和 因此没有传递给sysadmin@boatjump.com列出的权限 user.email 的电子邮件。

更新:

如果在正确设置委托后,您在检索委托人的电子邮件时仍然遇到问题,则此问题可能与已在 Google 问题跟踪器上报告的 this 行为有关。

我建议您给它一个“星”,以提高知名度和将来修复它的机会。

暂时的解决方法:

在使用具有域范围委托的服务帐户时,以委托人身份进行身份验证并代表他检索电子邮件(userId:“me”)。

【讨论】:

  • 可能是我解释错了,但我的主要 gmail 帐户是 user.email,我要委托的帐户是 userEmail
  • 那么 sysadmin@boatjump.com 是什么?
  • user.email = 系统管理员,userEmail = 我要迁移的电子邮件
  • emailToImpersonateuserEmail一样吗? gmail.users.settings.delegates.create({userId, requestBody}) 中的 userId 怎么样?
  • 我在 Google 的问题跟踪器上找到了与您的问题相关的 bug!我最初认为您的问题是由于错误的委托,但如果您的委托成功,您的权限错误可能与错误有关。我会更新我的答案。
猜你喜欢
  • 2017-06-19
  • 2019-09-20
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多