首页 > 解决方案 > 从服务帐户模拟 gCal 用户

问题描述

看起来像去年年底,谷歌改变了日历 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 模拟服务帐户的正确方法是什么?

标签: google-calendar-api

解决方案


您要查找的内容称为域范围委派,整个过程在此文档页面中非常详细。使用正确的库比实际向自己提出所有请求要简单和安全得多。

自己的谷歌文档中了解如何通过 HTTP 请求实现这一点:

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

出于这个原因,我们强烈建议您使用库,例如​​ Google API 客户端库,将加密从您的应用程序代码中抽象出来。


推荐阅读