Google Calendar API服务帐户错误

时间:2020-03-19 16:09:22

标签: php google-api google-calendar-api google-oauth

出现此错误

{ "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

这可能是解决方法。请帮忙。

4 个答案:

答案 0 :(得分:7)

以下是完成这项工作的步骤:

在您的服务帐户中启用域范围委派

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

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

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

服务帐户没有日历,因此您必须创建自己的日历

  • 使用您要拥有日历的电子邮件登录https://calendar.google.com/(我使用了另一个帐户,与我要模拟的帐户不同,也许可以使用模拟帐户中的日历工作) li>
  • 创建日历
  • 与具有修改和管理日历权限的服务帐户共享日历
  • 与您要模拟和修改日历的权限的帐户共享日历

创建Google客户

  • 验证您的服务帐户。 (我使用了JSON密钥,因此不确定是否其他身份验证可用于此目的)

代码示例:(我使用过PHP,但是我认为其他语言非常相似,因此您可以以此为准则)

请注意,使用一些电子邮件进行IMPERSONALIZATION非常重要。否则,将保留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]);

与邀请的人一起创建活动:)并享受乐趣!

注意: 通过这种方法,您可以创建事件并邀请人们参加。请记住G Suite https://support.google.com/a/answer/2905486的局限性,因此,如果要创建许多事件,则需要具有带有日历池的服务帐户池。

答案 1 :(得分:1)

仅供参考

在我的情况下,在Node.js上,我遵循来自@Anathorn的指示,但我一直在获取

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

然后我在我的身份验证行中添加电子邮件,我应该取代什么,并且它起作用了。

const auth = new google.auth.JWT(
    CREDENTIALS.client_email,`
    null,
    CREDENTIALS.private_key,
    SCOPES,
    "admin@domain.com",
    "12345678987654321"
);

答案 2 :(得分:0)

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

如果您授予它整个域的权限,但没有“模拟”任何帐户,则服务帐户的行为就好像您没有被授予此权限:它正在尝试访问自己的日历。

当服务帐户冒充域中的另一个用户(即代表该用户执行操作)时,服务帐户可以访问该用户可以访问的资源。

要模拟其他用户,您必须指定该用户的电子邮件地址。 就我而言,我使用Node.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 !!!!",
);

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

要执行此操作,您需要在G Suite域的管理控制台中添加https://www.googleapis.com/auth/gmail.send范围。

您可以在此处找到更多信息:https://issuetracker.google.com/issues/14170493

答案 3 :(得分:0)

对于可能遇到此问题的其他任何人,对我来说,这是 Anathorn 的回答和 Maksym Kalin 的回答的结合。这是因为我没有冒充用户的电子邮件地址。

一个用户之前曾尝试提交您正在使用的同一个库(我也在使用它),但被 repo 所有者拒绝了(多伤心)

https://github.com/spatie/laravel-google-calendar/pull/97

无论如何,他在这里的代码是我最终修复它的方式。

祝其他遇到这个问题的人好运,这让我痛苦太久了。