就像去年年底一样,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以获取承载令牌,但是它总是会出错。 (带有“无效的JWT:观众检查失败。正确的观众是...”,后面是看似较长的令牌令牌URL”
)
使用Google日历API模拟服务帐户的正确方法是什么?
答案 0 :(得分:0)
您要寻找的东西称为Domain Wide Delegation,此documentation page中的整个过程非常详细。使用正确的库比实际提出自己的所有请求要简单和安全得多。
从own google documentation开始,了解如何通过HTTP请求实现此目标:
建议:尽管您的应用程序可以通过使用HTTP与OAuth 2.0系统直接交互来完成这些任务,但是服务器到服务器身份验证交互的机制要求应用程序创建JSON Web令牌并对其进行加密签名(JWT),并且很容易犯严重错误,从而可能严重影响应用程序的安全性。
出于这个原因,我们强烈建议您使用库(例如Google API客户端库),以从您的应用程序代码中提取加密。