如何永久授权Google客户端直到用户撤销授权?
我正在尝试制作一个连接到的应用程序。它必须在PHP中运行,因此我使用的是google提供的Google客户机。
应用程序需要离线访问,所以当用户不在会话时,它就能工作。该应用程序旨在让用户在网站上公开管理和显示他的日历等等。
我使用服务方法(使用客户端ID和客户端机密)在Google控制台中创建了凭据。使用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 );这是类中的一个方法。
客户端ID和客户端秘密存储在应用程序设置中。
我也在将用户返回的代码存储在一个设置中,但我认为这就是我做错的地方?我将连接到Google OAuth窗口的方法放在一个单独的方法中(该方法也使用相同的客户端id和机密,并设置离线方法)。获得授权是有效的。我可以找到日历。它不会持续太久……
发布于 2015-09-22 06:38:58
有三种类型的代码或令牌,谷歌授权服务器返回。
认证码
当用户单击“授权”表单并授予应用程序访问权限时。Google向您返回授权代码。您应该使用此代码并将其交换为访问令牌和刷新令牌。此代码只使用一次,如果您再次尝试使用它,您将得到错误消息。
invalid_grant:代码已经被赎回了。
接入令牌
访问令牌用于访问API,此令牌应与您提出的每个请求一起发送。访问令牌是短暂的,它们工作一个小时,然后停止工作。
刷新令牌
刷新令牌应该保存在服务器的某个位置。一旦访问令牌过期,您可以使用刷新令牌获得一个新的访问令牌。
您的问题是,您正在保存对您毫无用处的身份验证代码。您需要找到刷新令牌并保存它。
https://stackoverflow.com/questions/32705682
复制相似问题