我知道有很多类似的问题,'invalid_grant'是我们从google api获得的唯一“答案”,但它们都是旧的,或者讨论了获取相同信息的不同方法。
奇怪的是,这个“东西”在2天前才停止工作。在我们的CRM中,我们将会议预订到与GoogleAccount相关联的GoogleCalendars。现在,在过去的两天里,我们遇到了问题,从未发生过。
应用程序失败了:
Fatal error: Uncaught exception 'Google_AuthException' with message 'Error refreshing the OAuth2 token, message: '{"error" : "invalid_grant";} Stack trace: #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 Object ( [batchHeaders:Google_HttpRequest:private] => Array ( [Content-Type] => application/http [Content-Transfer-Encoding] => binary [MIME-Version] => 1.0 [Content-Length] => ) [url:protected] => https://accounts.google.com/o/oauth2/token [requestMethod:protected] => POST [requestHeaders:protected] => Array ( [content-type] => application/x-www-form-urlencoded [content-length] => 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] => Array ( [content-type] => application/json; charset=utf-8 [cache-control] => no-cache, no-store, max-age=0, must-revalidate [pragma] => no-cache [expires] => Mon, 01 Jan 1990 00:00:00 GMT [date] => Thu, 10 Nov 2016 01:05:15 GMT [x-content-type-options] => nosniff [x-frame-options] => SAMEORIGIN [x-xss-protection] => 1; mode=block [server] => GSE [alt-svc] => quic=":443"; ma=2592000; v="36,35,34" [accept-ranges] => none [vary] => Accept-Encoding [transfer-encoding] => chunked ) [responseBody:protected] => { "error" : "invalid_grant" } [accessKey] => )
是的,我们使用的是旧版本而不是新版本。是的,帐户是实时的,我们尝试插入的日历是存在的。没有更改/重置任何权限或密码。我们尝试了所有日历 - 根本没有成功。我还尝试了一些我在这里发现的小改动/黑客,比如不使用开发者密钥,将访问类型设置为离线,同步服务器时间等等......
实际上,在整个事情发生之前我们什么都没做。所以有一个问题:Google是否改变了行为/代码中的某些内容?或者我们错过了什么(比如弃用/删除的功能)?
编辑#1
我的一所大学确实改变了一些事情。 (编辑部分末尾有更多内容)
所以我们有一个'主'谷歌帐户,机智开发人员密钥和clientid以及所有内容 - >此帐户还有1个日历。
我们的同事还有多个其他谷歌帐户。我们有从主日历到日历的补助金,反之亦然。在我们的CMS中,我们尝试将一个事件(因此在Google_CalendarService上插入)添加到其中一个同事日历中。
所以我们的一位同事辞掉了这份工作,我的大学改变了 HIS 密码。并删除拨款。那么它发生在星期一的16:00和星期二早上我们得到了第一个错误。这一个谷歌帐户的变化是否会影响所有其他人的行为。主日历帐户的行为???
- 编辑结束#1
如果有人遇到类似这样的事情并设法修复,请提供一些建议。谢谢!
答案 0 :(得分:1)
2016/11/17更新:
我们确实发现了导致某些令牌被清除的问题。我们正在努力确保它不会再次发生。遗憾的是,无法恢复已删除的令牌,您的用户将不得不重新授权。
我们(Google身份小组)正在调查此问题,因为其他一些开发人员也与我们联系过。为了加快调试速度, 你可以通过我的G +档案给我看看,这样我就可以获得一些信息并进行调查。
"谷歌是否改变了行为/代码中的某些内容? "答案是没有没有故意改变。
答案 1 :(得分:1)
每个人都好消息(关心的人)!
经过无休止的挖掘和尝试失败后,我发现谷歌实际上已经阻止了我们的旧访问令牌。也许这是密码更改和授权从我们这边删除,也许是前同事试图撤销或重置某些东西,不确定。但令牌不再活跃了。
在Oauth2 Playground的一些小挑战之后,我已经建立了与我们的API凭据的连接,并获得了新的连接首选项(新的访问令牌和新的刷新令牌)
特别感谢@DaImTo大声呼吁,指出它可能是非活动/旧标记导致此问题的原因。
@Google:请添加有意义的错误消息和错误说明,如果需要2-3天的时间来解决“未成年人”问题,那么丢失几分钟到几小时会更加凉爽。但像这样的关键问题!
我希望这篇文章将来会帮助一个人。和平!
答案 2 :(得分:0)
我对我制作的旧应用程序遇到了同样的问题。通过重新生成客户端密钥和开发人员密钥只是为了安全,应用程序再次运行,您将尝试的任何其他操作都将失败。可悲的是一个浪费的早晨。