刷新OAuth2令牌时出错@ Google_CalendarServices(php)

时间:2016-11-10 01:21:11

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

我知道有很多类似的问题,'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

如果有人遇到类似这样的事情并设法修复,请提供一些建议。谢谢!

3 个答案:

答案 0 :(得分:1)

2016/11/17更新:

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

我们(Google身份小组)正在调查此问题,因为其他一些开发人员也与我们联系过。为了加快调试速度, 你可以通过我的G +档案给我看看,这样我就可以获得一些信息并进行调查。

"谷歌是否改变了行为/代码中的某些内容? "答案是没有没有故意改变。

答案 1 :(得分:1)

每个人都好消息(关心的人)!

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

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

特别感谢@DaImTo大声呼吁,指出它可能是非活动/旧标记导致此问题的原因。

@Google:请添加有意义的错误消息和错误说明,如果需要2-3天的时间来解决“未成年人”问题,那么丢失几分钟到几小时会更加凉爽。但像这样的关键问题!

我希望这篇文章将来会帮助一个人。和平!

答案 2 :(得分:0)

我对我制作的旧应用程序遇到了同样的问题。通过重新生成客户端密钥和开发人员密钥只是为了安全,应用程序再次运行,您将尝试的任何其他操作都将失败。可悲的是一个浪费的早晨。