当前位置: 首页 > 知识库问答 >
问题:

Gmail API服务号访问*需要*授权域范围的权限只从所有者的地址发送邮件吗?

蔡鸿骞
2023-03-14

我正在尝试使用Gmail API(使用OAUTH)从Windows应用html" target="_blank">程序向我们公司的员工发送电子邮件。电子邮件只需要来自一个地址——一个专门为此目的创建的地址。我设置了一个服务号,并完成了生成凭据的过程。管理员批准了“发送”和“撰写”的认证范围。

但当我试图发送消息时,我会出现以下错误:

Google. Apis. Auth. OAuth2。响应。令牌响应异常:'错误:"invalid_request",描述:"无效模拟"子"字段。",Uri:""'

我已经尝试使用服务号电子邮件地址而不是上面的“我”。当我这样做时,我会得到这个错误:

Google. Apis. Auth. OAuth2。响应。令牌响应异常:'错误:"unauthorized_client",描述:"客户端未授权使用此方法检索访问令牌,或客户端未授权任何请求的范围。",URI:""'

我还没有将整个域的权限委托给服务帐户。这对我们来说似乎很危险。目前尚不清楚这样做是否使该帐户能够访问每个人的电子邮件?在我看来,如果谷歌云项目是从将发送电子邮件的帐户创建的,并且如果服务帐户也与该项目和同一用户电子邮件关联,那么它应该已经有权从该帐户发送电子邮件。为什么它需要域范围的访问?

需要吗?还是我还有别的问题?我发现的很多访问Gmail API的例子都已经过时了,我不确定我是否只是错过了这个谜题的其他部分。如果我只想让服务帐户能够从创建服务帐户的同一地址发送电子邮件,那么是否有必要对服务帐户进行全域授权?

以下是我使用的代码:

        string[] Scopes = {GmailService.Scope.GmailSend };
        string ApplicationName = "XXXXXX";

        ServiceAccountCredential credential;

        string serviceAccountEmail = "xxxxxx@xxxxx.iam.gserviceaccount.com";
        string jsonfile = "xxxxxx-f2fea9069fb5.json";
        using (Stream stream = new FileStream(@jsonfile, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            credential = (ServiceAccountCredential)
                GoogleCredential.FromStream(stream).UnderlyingCredential;

            var initializer = new ServiceAccountCredential.Initializer(credential.Id)
            {
                User = "me",
                Key = credential.Key,
                Scopes = Scopes
            };
            credential = new ServiceAccountCredential(initializer);
        }


        // Create Gmail API service.
        var service = new GmailService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = ApplicationName,
        });

        string plainText = "To: someone@somewhere.com\r\n" +
                           "Subject: subject Test\r\n" +
                           "Content-Type: text/html; charset=us-ascii\r\n\r\n" +
                           "<h1>Body Test </h1>";

        var newMsg = new Google.Apis.Gmail.v1.Data.Message();
        newMsg.Raw = Base64UrlEncode(plainText.ToString());
        service.Users.Messages.Send(newMsg, "me").Execute();

感谢任何回复。

共有1个答案

洪念
2023-03-14

如果您使用的是Gsuite域,并且已设置了域范围的权限,则服务帐户只能与Gmail一起使用

还请记住,使用gmail api可能会花费您的成本来验证应用程序。这可能也可能不重要,如果它是内部使用,我不确定。

 类似资料:
  • 我正在使用Gmail API,并试图从公司下的所有用户那里获取电子邮件。但当我运行以下代码时: 我得到错误: API返回了一个错误:错误:委派被拒绝xxxx@xxxxx.com 在管理控制台中,我这样做: 作为客户端名称,我使用了文件中的id。对于范围,我给了它所有权限。 如何正确设置Gmail API的域范围授权?

  • 正如在链接https://developers.DocuSign.com/esign-rest-api/guides/authentication/oauth2-code-grant中提到的,DocuSign允许获取用户数据的三个访问范围:签名、扩展和模拟。我正在寻找一个范围,允许我只读取访问。我需要建立一个仪表板的各种活动/更新(获得所有信封的状态,等等)的所有DocuSign用户在我的公司。

  • 我们需要访问谷歌日历API与服务器应用程序,以创建事件和邀请与会者。谷歌建议使用服务帐户的应用程序。 这里的主要问题是与会者邀请参加活动,因为如果没有域范围的授权,服务帐户就不能这样做(请参见img)。 组织不希望授予服务帐户访问所有用户数据的权限。所以,我想知道我们是否可以将域范围的授权委托给域的一个用户?(限制访问以使用其他用户的数据)。 附言。它只是关于谷歌日历API。 非常感谢你的帮助。

  • 我目前使用的谷歌服务帐户启用了域范围的委托(我使用了这个链接https://developers.Google.com/identity/protocols/oauth2/service-account,和这个链接https://developers.Google.com/admin-sdk/reports/v1/guides/developy),并且启用了“https://www.googlea

  • 我的应用程序使用可访问性权限,每次运行它时,我都需要手动授予权限,这很乏味,是否有一个选项可以通过某些命令授予我的应用程序此权限,仅用于调试目的?非常感谢。

  • 我正在使用Unity游戏引擎创建游戏。在这个游戏中,我抓取了一个屏幕截图,并将其保存到Unity的默认文件夹(“Application.PersistentDataPath”): /data/data/de.mytest.mygame/files/screenshot.png 如何修复此权限问题? 编辑:创建意图如下所示: