看起来像去年年底,Google更改了日历API的行为,不允许服务帐户与参与者创建日历事件。
https://github.com/googleapis/google-api-php-client/issues/1725
https://support.google.com/calendar/thread/16769831?hl=en
因此,要与参与者创建活动,必须确保为服务帐户设置了域范围的委派,然后为服务帐户尝试向其中写入事件的日历指定目标/代理帐户。我做了前者,而后者我有以下代码...
const jwt = jsonwebtoken.sign({
iss: GOOGLE_CALENDAR_SERVICE_ACCOUNT_EMAIL,
scope: SCOPES,
aud: 'https://oauth2.googleapis.com/token',
iat: currentUnixTimeInSeconds,
exp: currentUnixTimeInSeconds + 3600,
sub: GOOGLE_CALENDAR_TARGET_ACCOUNT_EMAIL,
},
privateKey,
{
algorithm: 'RS256',
header: {
alg: 'RS256',
typ: 'JWT',
},
}
);
...,然后调用https://oauth2.googleapis.com以获取承载令牌,但始终会出错。
使用Google日历API模拟服务帐户的正确方法是什么?
您要查找的内容称为Domain Wide Delegation,整个过程在此documentation page中非常详细。使用正确的库比实际提出自己的所有请求要简单和安全得多。
关于如何通过HTTP请求实现此目标的own google documentation:>
推荐:
尽管您的应用程序可以通过使用HTTP直接与OAuth 2.0系统进行交互来完成这些任务,但是服务器到服务器身份验证交互的机制要求应用程序创建并加密签名JSON Web令牌(JWT),而且很容易造成严重错误,从而严重影响应用程序的安全性。由于这个原因,我们强烈建议您使用库
,例如Google API客户端库,它抽象加密远离您的应用程序代码。