【问题标题】:GMail API Super Admin access other users accounts via API?GMail API 超级管理员通过 API 访问其他用户帐户?
【发布时间】:2015-08-27 11:57:04
【问题描述】:

自 2009 年初以来,我的机构目前正在运行 Google Apps for Education。我负责创建、删除、修改等学生电子邮件帐户。我已将所有现有的 C# 应用程序从 GData 转换为新的 Admin SDK - 生活很美好。

上周,其中一个部门向大约 800 名学生发送了一封包含错误的电子邮件。有人问我是否可以创建一个能够删除 800 名学生收件箱的电子邮件的快速应用程序。

使用我的“超级管理员”域帐户,我能够使用 Gmail API 创建一个应用程序,以进入我的收件箱并选择符合特定条件的特定电子邮件;示例:from:xxxx@domain.edu AND is:unread AND subject:test 我能够返回一组消息 ID,然后我可以将它们从收件箱中删除——太棒了!

由于我能够在收件箱上执行此操作,我想我会进行另一次测试并插入这 800 个电子邮件地址中的一个并获得相同的结果。不幸的是,我收到了这条错误消息:

错误:Google.Apis.Requests.RequestError xxxxx@domain.edu 的委派被拒绝 [403] 错误 [消息[xxxxxx@domain.edu 的委托被拒绝]位置[-]原因[禁止]域[全局]]

我确实阅读了有关帐户委托的内容,但这需要从我的“超级管理员”帐户发送请求并且学生接受它。

会不会是域的“超级管理员”除了自己的收件箱外,对任何收件箱都没有这些权限?我已尝试阅读帖子和 Google 的文档,但似乎无法找到有关此主题的答案。

在此桌面应用程序的开发者控制台中启用了 Gmail API。

我使用的服务帐户已获得授权,并且在 C# 应用程序中使用了正确的范围:

Scopes = new[] { 
                        "https://mail.google.com",
                    GmailService.Scope.GmailCompose,
                    GmailService.Scope.GmailInsert,
                    GmailService.Scope.GmailLabels,
                    GmailService.Scope.GmailModify,
                    GmailService.Scope.GmailReadonly,
                    GmailService.Scope.MailGoogleCom,
                    "https://www.googleapis.com/auth/userinfo.email",
                    "https://www.googleapis.com/auth/userinfo.profile"},

我的 C# 代码:

List<Google.Apis.Gmail.v1.Data.Message> result = new List<Google.Apis.Gmail.v1.Data.Message>();

UsersResource.MessagesResource.ListRequest request = GoogleToken.GoogleService().Users.Messages.List("xxxxx@domain.edu");

request.Q = " from:xxxx@domain.edu AND is:unread AND subject:test ";

            do
            {
                try
                {
                    ListMessagesResponse response = request.Execute();
                    result.AddRange(response.Messages);
                    request.PageToken = response.NextPageToken;
                }
                catch (Exception eX)
                {
                    Debug.WriteLine("Error: " + eX.Message);
                }
            }
            while (!String.IsNullOrEmpty(request.PageToken));

            Debug.WriteLine("Done");
            Debug.WriteLine(result);
        }

【问题讨论】:

    标签: google-api gmail-api google-api-dotnet-client


    【解决方案1】:

    即使您是域中的管理员,您也无法以您自己 身份进行身份验证并访问其他邮箱。但是,作为域管理员,您可以将您的应用列入白名单以访问域中的所有用户。它涉及使用具有域范围委派的服务帐户。您需要在 Google Apps Cpanel 中将您的应用列入白名单,并使用稍有不同的身份验证流程。看: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority

    虽然确实会发生电子邮件错误,但请让他们回复并跟进以纠正错误信息。从“用户信任”的角度来看,即使有可能,从他们的邮箱中删除电子邮件似乎也是一个非常糟糕的主意(如果你有一个错误并删除了错误的邮件会发生什么!) - 有人尝试过推理说关于这个想法的人? :-D 已经看过电子邮件的用户可能会在它消失时感到担心/困惑,等等。

    【讨论】:

      【解决方案2】:

      为了访问其他用户帐户,每个用户都必须对您的应用程序进行身份验证和授权才能访问特定范围。

      完成后,您将获得一个授权令牌,您可以使用它来获取刷新令牌。

      然后您可以使用这些刷新令牌并访问帐户,除非用户撤销访问权限

      但是,您无法避免每个用户接受提供对您的应用程序的访问权限的一次性活动。

      【讨论】:

      • 任何人都可以确认这是虚假陈述吗? (所有可能的情况)
      猜你喜欢
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      相关资源
      最近更新 更多