php Google认证:OAuth2继续返回“invalid_grant”

kb5ga3dv  于 2023-10-15  发布在  PHP
关注(0)|答案(7)|浏览(327)

我开始在我的新应用程序上配置谷歌日历。我几乎完全复制了谷歌开发人员(https://developers.google.com/google-apps/calendar/instantiate)上显示的验证代码,但我一直收到以下错误:
获取OAuth2访问令牌时出错,消息:'invalid_grant'
我目前正在使用Fork-CMS(http://www.fork-cms.com),一个年轻的轻量级CMS。我正确地配置了google-api-php-client的php.php文件。(client-id,client-secret,redirect-uri,development key,...)并且在google API的控制台上正确设置了重定向URI。我的代码如下所示:

<?php

/**
* This is a widget with a calendar implementation.
*
* @package       frontend
* @subpackage    events
*
* @author        Michiel Vlaminck <[email protected]>
*/
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);
    }
}

?>

当我第一次打开这个小部件页面时,我被引导到google来验证应用程序。当我同意时,我被重定向到我的应用程序,这就是我得到的:

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
cyvaqqii

cyvaqqii1#

您应该重用第一次成功验证后获得的访问令牌。如果您之前的令牌尚未过期,您将收到invalid_grant错误。把它放在某个地方,这样你就可以重新使用它。

p5cysglq

p5cysglq2#

我有一个类似的问题所造成的时间在我的服务器上是不正确的。确保您的系统时钟同步。

i7uq4tfw

i7uq4tfw3#

转到您的Google API控制台(https://code.google.com/apis/console/),并在已安装应用程序的客户端ID下撤销您的客户端密码。
请确保使用新的客户端密码更新代码

piok6c0g

piok6c0g4#

1.请访问security.google.com
1.撤销访问权限
1.再次访问验证URL
1.您将获得一个新的刷新令牌

mgdq6dx1

mgdq6dx15#

如果您错误地尝试验证您的ID令牌,而不是您的访问令牌,您也会收到此错误。
所以不要像我一样--确保你在代码中传递了正确的令牌!

polkgigr

polkgigr6#

我也有类似的问题。“invalid_grant”的问题是,它基本上是一个占位符,用于表示与令牌相关的任何错误。我发现this的文章真的很有帮助。

kqqjbcuj

kqqjbcuj7#

你要注意两件事
1.您给予访问某些站点(本地主机或远程服务器)的权限
1.我认为每次访问get_oauth_token.php都会生成一个新的令牌。
因此,请确保使用新令牌并给予对正确站点的权限。

相关问题