【发布时间】:2018-01-08 21:46:32
【问题描述】:
如何在用户撤销授权之前永久授权 Google 客户端?
我正在尝试制作一个连接到 Google 日历的应用。它必须在 PHP 中运行,因此我使用的是 google 提供的 Google API PHP 客户端。
应用需要离线访问,以便在用户不在会话中时运行。该应用旨在让用户在网站等上公开管理和显示他的日历。
我使用服务方法(使用客户端 ID 和客户端密码)在 Google 控制台中创建了凭据。使用 Google API 客户端,我还请求用户授权。我打开一个新的浏览器窗口,用户授权,谷歌返回一个授权码。我将这段代码存储起来并使用它来授权客户端,该客户端成功连接到 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 );
这是一个类中的方法。
客户端 ID 和客户端密码存储在应用设置中。
我还将用户返回的代码存储在一个设置中,但我认为这是我做错的地方?我将指向 Google OAuth 窗口的链接放在一个单独的方法中(它也使用相同的客户端 ID 和密码,并设置离线方法)。并且获得授权正在工作。我可以访问日历。它不会持续很长时间......
【问题讨论】:
标签: php oauth google-api google-oauth google-api-php-client