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

谷歌日历API服务帐户错误

龙俭
2023-03-14

我收到了这个错误

{ "error": 
     { "errors": 
         [
            { "domain": "calendar", "reason": "forbiddenForServiceAccounts", "message": "Service accounts cannot invite attendees without Domain-Wide Delegation of Authority." } 
         ], 
         "code": 403,
         "message": "Service accounts cannot invite attendees without Domain-Wide Delegation of Authority."
      } 
}

已经跟踪了https://developers.google.com/admin-sdk/directory/v1/guides/delegation

我使用这个库,并在laravel 5.7:https://github.com/spatie/laravel-google-calendar上运行它

有什么办法可以解决这个问题。请帮忙。

共有3个答案

裴浩歌
2023-03-14

只是为了信息

就我而言,在节点上。js,我遵循@Anathorn的指示,但我一直在

如果没有域范围的授权,服务帐户无法邀请与会者

然后,我在我的授权行上添加了一封电子邮件,我应该替换什么,它成功了。

const auth = new google.auth.JWT(
    CREDENTIALS.client_email,`
    null,
    CREDENTIALS.private_key,
    SCOPES,
    "admin@domain.com",
    "12345678987654321"
);
子车文康
2023-03-14

向服务帐户授予全域权限的目的是使这些帐户能够代表域中的用户访问数据。

如果您授予它域范围的权限,但没有“模拟”任何帐户,服务帐户就像您没有授予这种权限一样:它正试图访问自己的日历。

当服务帐户模拟域中的另一个用户时(即,当它代表该用户行事时),该服务帐户可以访问该用户可以访问的资源。

要模拟另一个用户,您必须指定用户的电子邮件地址。在我的例子中,我使用节点。JS库,我的模拟代码如下:

const auth = new google.auth.JWT(
  config.client_email,
  null,
  config.private_key,
  ["https://www.googleapis.com/auth/calendar.events"],
  "!!! user email to impersonate !!!!",
);

此外,如果您需要填写Attenders[]数组,您必须授权服务帐户发送电子邮件。因为你会犯未经授权的错误。

要做到这一点,你需要添加https://www.googleapis.com/auth/gmail.send范围在您的G套件域的管理控制台上。

你可以在这里找到更多信息:https://issuetracker.google.com/issues/14170493

方永贞
2023-03-14

以下是实现这一目标的步骤:

在服务号中启用域范围委托

1-为您的服务帐户提供日历范围

  • 去https://admin.google.com/并使用G套件帐户登录
  • 去保安局-

2-您的用户需要具有服务帐户令牌创建者的角色

  • 去https://console.cloud.google.com/iam-admin然后
  • 选择您的项目并转到左侧菜单中的IAM
  • 选择要用于模拟的帐户
  • 点击编辑
  • 添加角色服务帐户令牌创建者
  • 根据为帐户启用域委派https://developers.google.com/admin-sdk/directory/v1/guides/delegation,部分要启用G套件域范围的委派,请执行以下步骤

3-在您要模拟的帐户中创建日历

服务帐户没有日历,所以你必须创建自己的日历

  • 登录https://calendar.google.com/对于您想要拥有日历的电子邮件(我使用了不同的帐户,与我要模拟的帐户不一样,可能在模拟的帐户中使用日历就可以了)
  • 创建日历
  • 与具有修改和管理日历权限的服务帐户共享日历
  • 与您将模拟的帐户共享日历,该帐户具有修改和管理日历的权限

创建谷歌客户端

  • 验证您的服务号。(我使用了JSON Key,我不确定其他身份验证是否适用于此目的)

代码示例:(我使用了PHP,但我假设其他语言非常相似,所以您可以将此作为指南)

请注意,使用一些电子邮件进行模拟是至关重要的。否则,403错误将保留,使用它进行身份验证,有关详细信息,请参阅Maksym Kalin响应。

$google_client = new Google_Client();
$google_client->setAuthConfig($LOCATION_OF_JSON_KEY);
$google_client->setAccessType( 'offline' );
$google_client->setSubject('EmailToImpersonate@SomeAddress.com');
$google_client->setApplicationName("YourApplicationName");
$google_client->setScopes([\Google_Service_Calendar::CALENDAR, \Google_Service_Calendar::CALENDAR_EVENTS]);

与受邀人员一起创建活动:)并尽情享受!

注意:使用这种方法,您可以创建事件并邀请人们参加。请记住谷歌办公套件的限制https://support.google.com/a/answer/2905486所以如果你想创建许多事件,你需要有一个带有日历的服务账户池。

 类似资料:
  • 我正在使用Google. net客户端库来访问谷歌日历应用编程接口。我需要研发创建日历事件并将其发布给用户的应用程序。 这是一个服务器到服务器的应用程序,所以我创建了一个服务帐户,并用它来发送邀请。当从web浏览器提交响应时,创建的与会者对这些事件的响应将被更新,但当来自outlook等任何邮件客户端的响应时,响应将以电子邮件的形式发送给服务帐户电子邮件id(这是一个虚拟电子邮件id)。如何将有效

  • 我正在使用一个服务帐户访问我们的域名用户的谷歌驱动器,这工作像一个魅力!然而,我现在正在尝试使用相同的服务帐户获得用户的activity在谷歌驱动器。 我已授予服务帐户API访问https://www.googleapis.com/auth/activity和https://www.googleapis.com/auth/drive的权限 并启用API! 然而我总是得到错误403,禁止! 可能需要

  • 因此,我已将服务号设置为域范围的授权,如本文所述执行谷歌办公套件域范围的授权。在谷歌办公套件管理控制台中,我已授权服务号使用OAuth 2.0范围: 每次我试图创建一个事件,最终都会出现这个错误 这建立了google凭据,不使用模拟,日历与服务号共享。

  • 我有一个应用程序使用s2s与谷歌日历API的连接。我需要在不同的用户日历中创建事件。若要使之成为可能,用户应转到日历的设置并将其日历共享到服务帐户。但我想为用户简化这一点 - 这样他们就不需要去他们的日历设置。我没有用于用户交互的界面 - 这是一个机器人。如何以其他方式访问用户的日历?

  • 我们正在中开发一个内部应用程序。其中一个要求是应用程序的所有用户必须能够看到预定义的Gmail帐户(例如。)中的邮件数量,这是谷歌办公套件的一部分。这意味着登录应用程序的每个用户都能够看到这些信息,而无需任何额外的谷歌登录或类似的东西。应用程序应该能够在没有用户交互的情况下访问电子邮件,只需使用代码。 阅读文档后,我注意到有两种类型的账户——普通账户和服务账户。我有以下问题: 哪种账户类型适合我们

  • 我为我的帐户name@steelkiwi.com(谷歌应用程序)创建了服务帐户,我的应用程序运行良好。然后我为我的个人帐户name@gmail.com创建了服务帐户,为我的应用程序使用这个新的凭据,现在当我试图插入文件时,我得到错误500和下一个文本: HttpError 500请求https://www.googleapis.com/upload/drive/v2/files时?quotause