php Google日历API服务帐户错误

4xy9mtcn  于 2023-03-22  发布在  PHP
关注(0)|答案(6)|浏览(185)

我得到这个错误

{ "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
有什么办法可以解决这个问题。请帮帮忙。

axr492tv

axr492tv1#

以下是完成此操作需要遵循的步骤:

在您的服务帐户中启用全域委派
1 -为服务帐户提供日历范围

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

  • 使用您想要拥有日历的电子邮件登录https://calendar.google.com/(我使用了不同的帐户,与我要模拟的帐户不同,也许在模拟帐户中使用日历可以工作)
  • 创建日历
  • 与具有修改和管理日历权限的服务帐户共享日历
  • 与您将模拟的具有修改和管理日历权限的帐户共享日历
    创建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的限制,因此如果您想要创建许多活动,则需要具有日历池的服务帐户池。

f87krz0w

f87krz0w2#

向服务帐户授予域范围权限的目的是使这些帐户能够代表域中的用户访问数据。
如果您授予它域范围的权限,但没有“模拟”任何帐户,则服务帐户的行为就像您没有授予此权限一样:它正在尝试访问自己的日历。
当服务帐户模拟域中的另一个用户时(即,当它代表该用户时),服务帐户可以访问该用户可以访问的资源。
要模拟另一个用户,你必须指定用户的电子邮件地址。在我的例子中,我使用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 !!!!",
);

更重要的是,如果您需要填写attendees[]数组,您必须授权服务帐户发送电子邮件。因为您会收到未经授权的错误。
为此,您需要在G Suite域的管理控制台上添加https://www.googleapis.com/auth/gmail.send作用域。
你可以在这里找到更多:https://issuetracker.google.com/issues/14170493

u3r8eeie

u3r8eeie3#

只是为了得到信息
在我的例子中,在Node.js上,我遵循@Anathorn的介绍,但我不断得到
服务帐户无法邀请没有全域授权的与会者
然后我在我的auth行上添加了我应该取代的电子邮件,它起作用了。

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

5f0d552i4#

对于那些使用googleapis-nodejs-client库的人,在google-auth-library-nodejs github页面上有一个问题的解决方案。
从@Anathorn执行所有conf步骤并以这种方式记录服务帐户对我来说很有效:

const auth = new google.auth.GoogleAuth({
keyFile: './service.json',
scopes: [
  'https://www.googleapis.com/auth/calendar',
  'https://www.googleapis.com/auth/calendar.events'
],
clientOptions: {
  subject: 'email@email.com'
},

});
编辑:它只在本地工作!
据我所知,你不能使用App Default Credendial,而运行在GCP(云函数对我来说)与域宽权限,只有使用认证与JWT应该是工作。

hc8w905p

hc8w905p5#

对于其他可能遇到这个问题的人来说,对我来说,这是Anathorn的答案和Maksym Kalin的答案的组合。这是因为我没有冒充用户的电子邮件地址。
一个用户以前曾试图提交你正在使用的库(我也在使用它),但被仓库所有者拒绝了(多么可悲)
https://github.com/spatie/laravel-google-calendar/pull/97
不管怎样,他的代码是我在我这边解决的。
祝任何有这个问题的人好运,它已经在我的屁股太长时间的痛苦。

xxslljrj

xxslljrj6#

Yilo的解决方案工作正常:-)

相关问题