Google API PHP 离线访问,"invalid_grant: Code was already redeemed"



如何永久授权谷歌客户端,直到用户撤销授权?

我正试图使一个应用程序连接到谷歌日历。它必须在PHP中运行,因此我使用谷歌提供的谷歌API PHP客户端。

应用程序需要有离线访问,以便在用户不在会话中时工作。该应用程序旨在让用户在网站等公开管理和显示他的日历。

我已经在谷歌控制台创建凭据,使用服务方法(与客户端ID和客户端秘密)。我还使用Google API客户机向用户请求授权。我打开一个新的浏览器窗口,用户进行授权,Google返回一个授权码。我将此代码存储起来,并使用它来授权客户端,客户端成功连接到Google Calendar并交换数据。

现在,我明白了这是一个即将过期的令牌。除非是我设置的脱机访问。然而,几分钟或更短的时间后,我总是得到一个错误: Error fetching OAuth2 access token, message: 'invalid_grant: Code was already redeemed.

这是我用来连接客户端的代码:

$client = new Google_Client();
$client->setApplicationName( 'My App' );
$client->setScopes( array( Google_Service_Calendar::CALENDAR ) );
$client->setClientId( $this->google_client_id );
$client->setClientSecret( $this->google_client_secret );
$client->setRedirectUri( $this->google_client_redirect );
$client->setAccessType( 'offline' );
if ( $code = $this->google_client_auth ) {
    try {
        $client->authenticate( $code );
    } catch( Exception $e ) {
            var_dump( $e );
    }    
}
return new Google_Service_Calendar( $client );

这是一个类中的方法。

客户端ID和客户端秘密存储在应用程序设置中。

我还将用户返回的代码存储在设置中,但我认为这是我做错的地方?我把链接到谷歌OAuth窗口在一个单独的方法(它也使用相同的客户端id和秘密,并设置离线方法)。获得授权是可行的。我可以找到日历。它只是不会持续太久……

google身份验证服务器返回的代码或令牌有三种类型:

    <
  1. 验证代码/gh>
  2. 访问令牌
  3. 刷新令牌。
<

验证代码/strong>

当用户单击authentication表单并授予您的应用程序访问权限时。谷歌返回给你一个验证码。您应该使用此代码并将其交换为访问令牌和刷新令牌。此代码只使用一次,如果您尝试再次使用它,您将得到一个错误消息。

invalid_grant:代码已被赎回。

访问令牌

访问令牌用于访问api,此令牌应与您发出的每个请求一起发送。访问令牌的寿命很短,它们工作一个小时,然后停止工作

<

刷新令牌/strong>

刷新令牌应该保存在服务器的某个地方。一旦访问令牌过期,您可以使用刷新令牌来获取新的访问令牌。

您的问题是您正在保存对您没有用处的认证代码。您需要找到刷新令牌并保存它。

相关内容

  • 没有找到相关文章

最新更新