【问题标题】:PHP - Can't create new Google Calendar event using an API KeyPHP - 无法使用 API 密钥创建新的 Google 日历事件
【发布时间】:2019-07-24 18:32:19
【问题描述】:

我正在尝试仅使用我创建的 API Key 插入一个新事件。

问题是,当我只是使用 FreeBusy 检查可用时间时,一切正常,但是当我尝试创建和插入新事件时,出现以下错误:

Uncaught Google_Service_Exception: {
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Login Required",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Login Required"
 }
}

授权对 Google 日历 API 的请求页面中声明:

您的应用程序必须使用 OAuth 2.0 来授权请求​​。没有别的 支持授权协议。如果您的应用程序使用 Google 登录,为您处理授权的某些方面。

但我无法在每次请求时手动授权访问日历。

如何在无需手动授权的情况下授权请求并插入新事件?

【问题讨论】:

  • 如果您阅读文档developers.google.com/calendar/auth 中的其余页面,您会看到一旦用户授权您的应用访问他们的日历,它将向您发出一个令牌,您可以存储和使用用于将来调用 API。
  • @lufc 是的,我知道。问题是 1 小时后令牌过期,我必须通过终端再次手动运行我的代码,这样我才能获得身份验证链接,同意,复制代码,将其粘贴到终端,然后最后刷新令牌.
  • 在第一个小时之外使用刷新令牌生成新令牌。见这里getRefreshToken()github.com/googleapis/google-api-php-client/blob/master/src/…

标签: php google-api google-calendar-api google-oauth


【解决方案1】:

如果您想执行服务器到服务器的 API 请求,您需要使用服务帐户。请参阅https://developers.google.com/calendar/auth

通常您会创建一个密钥,然后下载提供的 JSON 文件。然后您可以调用$client->setAuthConfig($jsonPath); 来设置身份验证。将私钥保存在 Web 根目录之外可能是个好主意。然后使用$client->addScope('https://www.googleapis.com/auth/calendar') 设置范围,并使用$service = new Google_Service_Calendar($client); 实例化日历服务。你现在应该可以做你的事情了。

您可能还需要与生成的与服务帐户关联的电子邮件地址共享日历。

【讨论】:

  • 对不起,我可能应该为此提出另一个问题,但长话短说:我必须在同一个项目中创建一个新的服务帐户,获取一个新的私钥并使用所述私钥来授权请求,对吧?
  • 非常感谢您的更新,但不幸的是,它对我不起作用。我已经下载了 json,我确定我的私钥的路径是正确的,我可以使用 FreeBusy 读取日历,但是当我尝试插入事件时,现在它会抛出错误“未找到”。
  • 您是否与服务帐户的电子邮件地址共享日历?
  • 是的,我的服务帐号只有读取权限。我不能给它编辑权限,因为该选项是灰色的。无论如何,由于我的 json 有效,API 不应该返回另一个错误吗?尝试插入事件时,我不断收到 404 错误。
  • 在您解决所有依赖项之前,我不会指望 API 总是返回您认为在语义上正确的错误。有时语义被交换以换取安全性。在您进行更多调试之前,我会先获得写入权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2022-10-12
相关资源
最近更新 更多