【发布时间】: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