Google API PHP 离线访问,"invalid_grant: Code was already redeemed"
Google API PHP offline access, "invalid_grant: Code was already redeemed"
如何在用户撤销授权之前永久授权 Google 客户端?
我正在尝试制作一个连接到 Google 日历的应用程序。它必须在 PHP 中 运行 因此我正在使用 Google API PHP 由 google.
提供的客户端
该应用需要离线访问,以便在用户不在会话中时运行。该应用程序旨在让用户在网站等上公开管理和显示他的日历。
我已经在 Google 控制台中使用服务方法(带有客户端 ID 和客户端密码)创建了凭据。使用 Google API 客户端,我还请求用户授权。我打开一个新的浏览器window,用户授权,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 );
这是 class 中的一个方法。
客户端 ID 和客户端密码存储在应用程序设置中。
我还将用户返回的代码存储在一个设置中,但我认为这是我做错的地方?我将 link 放入 Google OAuth window 在一个单独的方法中(它也使用相同的客户端 ID 和密码并设置离线方法)。并且获得授权正在工作。我可以进入日历。它不会持续很长时间。 ..
代码或令牌分为三种类型 Googles 身份验证服务器 returns。
- 验证码
- 访问令牌
- 刷新令牌。
验证码
当用户单击身份验证表单并授予您的应用程序访问权限时。 Google returns 给你一个验证码。您应该获取此代码并将其交换为访问令牌和刷新令牌。此代码仅使用一次,如果您尝试再次使用它,您将收到一条错误消息。
invalid_grant: Code was already redeemed.
访问令牌
访问令牌用于访问 API,此令牌应随您发出的每个请求一起发送。访问令牌是短暂的,它们工作一个小时,然后停止工作
刷新令牌
刷新令牌应该保存在您服务器上的某个地方。访问令牌过期后,您可以使用刷新令牌获取新的访问令牌。
您的问题是您正在保存对您没有用的验证码。您需要找到刷新令牌并保存它。
如何在用户撤销授权之前永久授权 Google 客户端?
我正在尝试制作一个连接到 Google 日历的应用程序。它必须在 PHP 中 运行 因此我正在使用 Google API PHP 由 google.
提供的客户端该应用需要离线访问,以便在用户不在会话中时运行。该应用程序旨在让用户在网站等上公开管理和显示他的日历。
我已经在 Google 控制台中使用服务方法(带有客户端 ID 和客户端密码)创建了凭据。使用 Google API 客户端,我还请求用户授权。我打开一个新的浏览器window,用户授权,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 );
这是 class 中的一个方法。
客户端 ID 和客户端密码存储在应用程序设置中。
我还将用户返回的代码存储在一个设置中,但我认为这是我做错的地方?我将 link 放入 Google OAuth window 在一个单独的方法中(它也使用相同的客户端 ID 和密码并设置离线方法)。并且获得授权正在工作。我可以进入日历。它不会持续很长时间。 ..
代码或令牌分为三种类型 Googles 身份验证服务器 returns。
- 验证码
- 访问令牌
- 刷新令牌。
验证码
当用户单击身份验证表单并授予您的应用程序访问权限时。 Google returns 给你一个验证码。您应该获取此代码并将其交换为访问令牌和刷新令牌。此代码仅使用一次,如果您尝试再次使用它,您将收到一条错误消息。
invalid_grant: Code was already redeemed.
访问令牌
访问令牌用于访问 API,此令牌应随您发出的每个请求一起发送。访问令牌是短暂的,它们工作一个小时,然后停止工作
刷新令牌
刷新令牌应该保存在您服务器上的某个地方。访问令牌过期后,您可以使用刷新令牌获取新的访问令牌。
您的问题是您正在保存对您没有用的验证码。您需要找到刷新令牌并保存它。