出现此错误
{ "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
这可能是解决方法。请帮忙。
答案 0 :(得分:7)
以下是完成这项工作的步骤:
在您的服务帐户中启用域范围委派
1-为您的服务帐户提供日历范围
2-您的用户需要具有服务帐户令牌创建者角色
3-在您要模拟的帐户中创建一个日历
服务帐户没有日历,因此您必须创建自己的日历
创建Google客户
代码示例:(我使用过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
无论如何,他在这里的代码是我最终修复它的方式。
祝其他遇到这个问题的人好运,这让我痛苦太久了。