从服务帐户模拟gCal用户

时间:2020-03-04 05:18:37

标签: google-calendar-api

就像去年年底一样,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”

https://oauth2.googleapis.com/token?grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion= ...

使用Google日历API模拟服务帐户的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您要寻找的东西称为Domain Wide Delegation,此documentation page中的整个过程非常详细。使用正确的库比实际提出自己的所有请求要简单和安全得多。

own google documentation开始,了解如何通过HTTP请求实现此目标:

建议:尽管您的应用程序可以通过使用HTTP与OAuth 2.0系统直接交互来完成这些任务,但是服务器到服务器身份验证交互的机制要求应用程序创建JSON Web令牌并对其进行加密签名(JWT),并且很容易犯严重错误,从而可能严重影响应用程序的安全性。

出于这个原因,我们强烈建议您使用库(例如Google API客户端库),以从您的应用程序代码中提取加密

相关问题