【问题标题】:Error refreshing the OAuth2 token @ Google_CalendarServices (php)刷新 OAuth2 令牌@Google_CalendarServices (php) 时出错
【发布时间】:2016-12-01 17:46:51
【问题描述】:

我知道有很多类似的问题,其中“invalid_grant”是我们从 google api 获得的唯一“答案”,但它们都是旧的,或者正在讨论获取同一消息的不同方法。

奇怪的是,这个“东西”在 2 天前才停止工作。在我们的 CRM 中,我们将会议预订到与我们的 GoogleAccount 关联的 GoogleCalendars 中。现在在过去 2 天里,我们遇到了以前从未发生过的问题。

应用程序失败如下:

致命错误:未捕获的异常 'Google_AuthException' 带有消息'刷新 OAuth2 令牌时出错,消息:'{"error" : "invalid_grant";}

堆栈跟踪:

#0 /path/to/plugins/google-api-php-client/src/auth/Google_OAuth2.php(240): Google_OAuth2->refreshTokenRequest(Array)
#1 /path/to/plugins/google-api-php-client/src/auth/Google_OAuth2.php(217): Google_OAuth2->refreshToken('1/ourtoken...')
#2 /path/to/plugins/google-api-php-client/src/service/Google_ServiceResource.php(167): Google_OAuth2->sign(Object(Google_HttpRequest))
#3 /path/to/plugins/google-api-php-client/src/contrib/Google_CalendarService.php(494): Google_ServiceResource->__call('insert', Array)

这是实际的 http 答案:

Google_HttpRequest 对象 ( [batchHeaders:Google_HttpRequest:private] => 数组 ( [内容类型] => 应用程序/http [内容传输编码] => 二进制 [MIME 版本] => 1.0 [内容长度] => ) [url:protected] => https://accounts.google.com/o/oauth2/token [请求方法:受保护] => POST [requestHeaders:protected] => 数组 ( [内容类型] => 应用程序/x-www-form-urlencoded [内容长度] => 196 ) [postBody:protected] => client_id=111111111.apps.googleusercontent.com&client_secret=secretSECTRETsecretSECRET&refresh_token=1%2FveryLONGtokenSTRINGhafbuaADDFR&grant_type=refresh_token [userAgent:protected] => Google Calendar PHP Starter Application google-api-php-client/0.6.0 [responseHttpCode:protected] => 400 [responseHeaders:protected] => 数组 ( [内容类型] => 应用程序/json;字符集=utf-8 [缓存控制] => 无缓存,无存储,最大年龄 = 0,必须重新验证 [pragma] => 无缓存 [过期] => 1990 年 1 月 1 日星期一 00:00:00 GMT [日期] => 2016 年 11 月 10 日星期四 01:05:15 GMT [x-content-type-options] => nosniff [x-frame-options] => SAMEORIGIN [x-xss-保护] => 1;模式=块 [服务器] => GSE [alt-svc] => quic=":443";马=2592000; v="36,35,34" [接受范围] => 无 [变化] => 接受编码 [传输编码] => 分块 ) [responseBody:protected] => { “错误”:“invalid_grant” } [访问密钥] => )

是的,我们使用的是旧版本而不是任何新版本。是的,该帐户是活动的,我们尝试插入的日历是存在的。没有更改/重置权限或密码。我们尝试了所有的日历 - 根本没有成功。我还尝试了一些我在这里找到的小改动/黑客,比如不使用开发人员密钥、将访问类型设置为离线、同步服务器时间等等......

实际上,在它坏掉之前,我们什么也没做。所以有一个问题:谷歌是否改变了行为/代码或其他什么?还是我们遗漏了某些东西(例如已弃用/删除的函数)?

编辑 #1

事实上,我的一所大学确实改变了一些东西。 (更多内容在编辑部分末尾)

所以我们有一个“主”谷歌帐户,具有开发者密钥和客户端 ID 以及所有内容 -> 而且这个帐户还有 1 个日历。

我们的同事还有多个其他 Google 帐户。我们有从主日历到他们的日历的赠款,反之亦然。在我们的 CMS 中,我们尝试将事件(因此插入 Google_CalendarService)添加到其中一个同事日历中。

所以我们的一位同事辞职了,我的大学更改了 HIS 密码。并删除了赠款。好吧,它发生在星期一的 16:00 和星期二早上,我们遇到了第一个错误。这个谷歌帐户的更改会影响所有其他人的行为吗?主日历帐户的行为???

-- EDIT #1 结束

如果有人遇到过类似的情况并设法解决,请提供一些建议。谢谢!

【问题讨论】:

  • 您使用的是 Gmail 范围之一吗?用户最近有没有机会更改密码? “谷歌改变了行为/代码或什么?”我不确定,但过去几周我看到了大量这样的问题。我有一个 Google 联系人正在检查它。
  • 嗨@DaImTo,感谢您的评论。我们没有明确定义任何范围,我将编辑描述,为您提供更多关于使用的信息。来自你的谷歌家伙的反馈会非常好。干杯
  • 让我更清楚。在对用户进行身份验证时,您至少必须请求 google 日历范围。您是否请求任何其他权限?
  • 要明确:唯一的解决方法是再次请求身份验证。谷歌已经过期了刷新令牌,没有办法解决这个问题。这里真正的问题是:为什么谷歌会过期你的刷新令牌?这就是我们想要弄清楚的。
  • 好的,我明白了,但我们以前从未使用过作用域,如果我必须定义一个,我应该选择哪一个?没有其他权限请求。真的只有一个插入是我们在那里所做的一切。插入其中一位同事的谷歌日历 - 这当然不是改变的......

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


【解决方案1】:

大家好消息(谁在乎)!

在无休止的挖掘和尝试失败后,我发现谷歌实际上已经阻止了我们的旧访问令牌。也许是我们这边的密码更改和授权删除,也许是前同事试图撤销或重置某些东西,不确定。但令牌不再活跃。

在对 Oauth2 Playground 进行了一些小挑战后,我使用我们的 API 凭据建立了连接,并获得了新的连接首选项(新的访问令牌和新的刷新令牌)

特别感谢@DaImTo 指出,这可能是导致此问题的非活动/旧令牌。

@Google:请添加有意义的错误消息和错误描述,像这样的“次要”但关键问题,浪费几分钟到几小时(如 2-3 天)会更酷!

我希望这篇文章将来能对某人有所帮助。和平!

【讨论】:

    【解决方案2】:

    2016 年 11 月 17 日更新:

    我们确实发现了导致某些令牌被清除的问题。我们正在努力确保它不会再次发生。不幸的是,无法恢复已删除的令牌,您的用户将不得不再次重新授权。


    我们(Google 身份团队)正在调查此问题,因为其他一些开发者也已与我们联系。为了加快调试速度, 你能不能通过我的 G+ 个人资料给我发消息,以便我获取一些信息并进行调查。

    “Google 是否更改了行为/代码或其他内容?”答案是否定的,没有故意更改。

    【讨论】:

    • 根据我对这个问题的跟踪,它不是全部,而是随机的一个子集。大多数情况下,它至少在两周前使用过的刷新令牌突然不起作用。我还不能重新创建它。疯狂猜测可能与最近的时间变化有关吗?虽然这在前几年从来都不是问题。
    • @nvnagr 我向您发送了环聊邀请,不确定您是否想要。 Donno 说实话,如果它是一个或更多的象征。我将一个帐户(主帐户)集成到我们的系统中,并尝试将事件插入其他日历-> 每个日历分别是 1 个令牌还是 1 个令牌?但是它们都没有工作-> 甚至不能将事件插入到主帐户的日历中。 (我的意思是同一个帐户的日历,我正在做新的 Google_Client() 实例)
    • Elzo,同意这不是传统的“好”答案,但这甚至允许其他看到此问题并遇到类似问题的开发人员与我联系。这个问题的另一个答案是不准确的。我可以这么说,因为我的团队在 Google 运行 OAuth 服务。调查此问题后,我将编辑此答案。
    • @nvnagr 我们注意到在过去两周内撤销 (10 倍) refresh_tokens 的数量显着增加。据我们所知,这看起来对我们来说不是问题。与您取得联系的最佳方式是什么?我看不到如何在 G+ 上向你发送即时消息。
    • @DaImTo 我们注意到您在夏令时更改之前描述的问题(如果这就是您所说的最近时间更改的意思)。
    【解决方案3】:

    我制作的旧应用程序也遇到了同样的问题。通过重新生成客户端密钥和开发人员密钥以确保应用程序再次运行,您将尝试的任何其他操作都会失败。可惜浪费了一个上午。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 2012-07-21
      相关资源
      最近更新 更多