Google API PHP离线访问,"invalid_grant:代码已被兑换"

unf*_*vio 16 php oauth google-api google-oauth google-api-php-client

如何在用户撤销授权之前永久授权Google客户端?

我正在尝试创建一个连接到Google日历的应用.它必须在PHP中运行,因此我使用谷歌提供的Google API PHP客户端.

该应用程序需要具有脱机访问权限,以便在用户不在会话中时可以使用.该应用程序旨在让用户在网站等上公开管理和显示他的日历.

我使用服务方法(具有客户端ID和客户端密钥)在Google控制台中创建了凭据.使用Google API客户端,我还要求用户授权.我打开一个新的浏览器窗口,用户授权,Google会返回授权码.我使用此代码,存储并使用它来授权客户端,该客户端成功连接到Google日历并交换数据.

现在,我明白这是一个即将到期的令牌.除非我使用离线访问,我设置.但是,几分钟或更短时间后,我总会收到错误: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 );
Run Code Online (Sandbox Code Playgroud)

这是一个类中的方法.

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

我也将用户返回的代码存储在一个设置中,但我认为这是我做错的地方?我在一个单独的方法(也使用相同的客户端ID)中将链接放到Google OAuth窗口并秘密和设置离线方法).并获得授权工作.我可以到达日历.它只是不会持续很长时间...

DaI*_*mTo 28

有三种类型的代码或令牌谷歌认证服务器返回.

  1. 验证码
  2. 访问令牌
  3. 刷新令牌.

验证码

当用户单击"验证表"并授予您的应用程序访问权限时.Google会向您返回一个Authentcation代码.您应该使用此代码并将其交换为Access令牌和刷新令牌.此代码仅在您尝试再次使用时使用一次,您将收到错误消息.

invalid_grant:代码已被兑换.

访问令牌

访问令牌用于访问API,此令牌应与您发出的每个请求一起发送.访问令牌是短暂的,他们工作了一个小时,然后他们停止工作

刷新令牌

刷新令牌应该保存在您的服务器的某个地方.访问令牌到期后,您可以使用刷新令牌获取新的访问令牌.

您的问题是您正在保存对您没用的验证码.您需要找到刷新令牌并保存.