Php 谷歌认证:OAuth2不断返回';无效的授权';

Php 谷歌认证:OAuth2不断返回';无效的授权';,php,oauth-2.0,google-calendar-api,Php,Oauth 2.0,Google Calendar Api,我开始在我的新应用程序上配置谷歌日历。我几乎完全复制了google developers()上显示的身份验证代码,但我一直收到以下错误: 获取OAuth2访问令牌时出错,消息:“无效\u授权” 我目前正在使用Fork-CMS(),这是一种年轻的轻量级CMS。我正确配置了google api php客户端的config.php文件。(客户机id、客户机机密、重定向uri、开发密钥等)并且在google api的控制台上正确设置了重定向uri。我的代码如下所示: <?php /** * Th

我开始在我的新应用程序上配置谷歌日历。我几乎完全复制了google developers()上显示的身份验证代码,但我一直收到以下错误:

获取OAuth2访问令牌时出错,消息:“无效\u授权”

我目前正在使用Fork-CMS(),这是一种年轻的轻量级CMS。我正确配置了google api php客户端的config.php文件。(客户机id、客户机机密、重定向uri、开发密钥等)并且在google api的控制台上正确设置了重定向uri。我的代码如下所示:

<?php

/**
* This is a widget with a calendar implementation.
*
* @package       frontend
* @subpackage    events
*
* @author        Michiel Vlaminck <michielvlaminck@gmail.com>
*/
class FrontendEventsWidgetCalendar extends FrontendBaseWidget
{

    private $events = array();
    private $authUrl = array();

    /**
    * Execute the extra
    *
    * @return    void
    */
    public function execute()
    {      
        // call parent
        parent::execute();

        // load template
        $this->loadTemplate();

        // get data
        $this->getData();

        // parse
        $this->parse();
    }


    /**
    * Get the data from Google Calendar
    * This method is only executed if the template isn't cached
    *
    * @return    void
    */
    private function getData()
    {
        require_once PATH_LIBRARY . '/external/google-api-php-client/src/apiClient.php';
        require_once PATH_LIBRARY . '/external/google-api-php-client/src/contrib/apiCalendarService.php';

        $client = new apiClient();

        $service = new apiCalendarService($client);

        if (isset($_SESSION['oauth_access_token'])) {
            $client->setAccessToken($_SESSION['oauth_access_token']);
        } else {
            $token = $client->authenticate();
            $_SESSION['oauth_access_token'] = $token;
        }

        if ($client->getAccessToken()) {

            $calId = FrontendEventsModel::getCalendarId((int) $this->data['id']);
            $calId = $calId[0]['calendar_id'];

            $events = $service->events->listEvents($calId);
            $this->events = $events['items'];

            $_SESSION['oauth_access_token'] = $client->getAccessToken();

        } else {
            $this->authUrl = $client->createAuthUrl();
        }
    }


    /**
    * Parse
    *
    * @return    void
    */
    private function parse()
    {
        $this->tpl->assign('events', $this->events);
        $this->tpl->assign('authUrl', $this->authUrl);
    }
}

?>

您应该重用第一次成功身份验证后获得的访问令牌。如果您以前的令牌尚未过期,您将收到一个
无效\u grant
错误。将其缓存到某个地方以便重新使用。

转到您的Google API控制台()并在安装的应用程序的客户端ID下撤销您的客户端机密


请务必使用新的客户端密码更新您的代码。由于服务器上的时间不正确,我遇到了类似的问题。确保系统时钟同步

  • 请访问security.google.com
  • 撤销访问权
  • 再次访问身份验证url
  • 您现在将获得一个新的刷新令牌

  • 如果您错误地尝试验证您的ID令牌,而不是您的访问令牌,您也将收到此错误


    所以不要像我一样-确保您将正确的令牌传递到代码中

    我也有类似的问题。“invalid_grant”的问题在于,它基本上是与令牌相关的任何错误的占位符。我发现这篇文章非常有帮助。

    它现在被称为“重置您的客户机机密”,而不是“撤销”。在我的例子中,我使用的是以前从控制台p12密钥文件中删除的密钥文件…我认为这不再是真的。使用刷新令牌,我能够获得一个访问令牌,然后在第一个令牌过期之前获得另一个。(我想这也可以在OAuth 2.0游乐场中看到-)实际上。。我可以使用刷新令牌生成更多访问令牌,即使当前令牌尚未过期。它只会给我一个新的访问令牌,前一个仍然有效。所以我不确定你说的是不是准确。那很可能是真的。根据我当时的经验,我如实回答了这个问题。这是互联网时代一个古老的答案。在此期间,情况可能已经发生了变化。这也是我面临的问题。我正在使用一个虚拟机来运行API。起床后的时间还没有同步。我已经尝试了很多解决方法。这是我没有尝试过的最后一个解决方案,因为我不明白。“服务器上的时间不正确”是什么意思?如何检查系统时钟是否同步?我想知道@JohnI在我的Ubuntu Linux服务器上同步时间时做了以下操作,该服务器为我工作(假设你没有安装网络时间协议(ntp)守护程序):sudo apt get install ntp;sudo服务ntp站;sudo ntpdate-s time.nist.gov;sudo服务ntp启动
    apiAuthException » Main
    
    Message Error fetching OAuth2 access token, message: 'invalid_grant'
    File    C:\wamp\www\Officevibes\library/external\google-api-php-client\src\auth\apiOAuth2.php
    Line    105
    Date    Thu, 05 Apr 2012 08:34:47 +0000
    URL http://localhost/calendar?code=4/YPUpFklKvhEeTcMm4moRth3x49oe
    Referring URL   (Unknown)
    Request Method  GET
    User-agent  Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19