如何使用GoogleOAuth2、CalendarAPI和PHP处理过期的访问密钥?
尽管我已经尽了最大的努力阅读了手册,但我还是对谷歌的日历API和OAuth 2的授权感到困惑。我正在使用Google PHP客户端库 我有一个web应用程序,它成功地将事件添加到Google日历中。我的问题是,一个小时后,用户的访问密钥过期,导致添加新日历事件失败 我添加了一个讨厌的解决方案,它检测密钥过期并显示一个错误页面。然后,用户单击错误页面中的一个链接,该链接将取消访问令牌并拉下一个新令牌 我的理想解决方案是让用户在选择注销之前保持身份验证 我能问一下我在下面的过程中遗漏了什么,使我无法使用过期的密钥吗如何使用GoogleOAuth2、CalendarAPI和PHP处理过期的访问密钥?,php,google-api,Php,Google Api,尽管我已经尽了最大的努力阅读了手册,但我还是对谷歌的日历API和OAuth 2的授权感到困惑。我正在使用Google PHP客户端库 我有一个web应用程序,它成功地将事件添加到Google日历中。我的问题是,一个小时后,用户的访问密钥过期,导致添加新日历事件失败 我添加了一个讨厌的解决方案,它检测密钥过期并显示一个错误页面。然后,用户单击错误页面中的一个链接,该链接将取消访问令牌并拉下一个新令牌 我的理想解决方案是让用户在选择注销之前保持身份验证 我能问一下我在下面的过程中遗漏了什么,使我无法
function doGoogleAuth( ) {
require_once 'assets/vendor/google-api-client/src/Google/autoload.php';
$client = new Google_Client();
$client->setApplicationName('');
$client->setClientId('');
$client->setClientSecret('');
$client->setAccessType('offline');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback');
$client->setScopes(array(implode(' ', array(Google_Service_Calendar::CALENDAR, Google_Service_Drive::DRIVE))));
if (isset($_SESSION['access_token']) && $_SESSION['access_token'] ) {
$client->setAccessToken($_SESSION['access_token']);
if( $client->isAccessTokenExpired() ){
$error = "There has been an error with your Google Security Token. <a href=\"/destroy_token\">Click here</a> to get a new security token.";
include("view/error.php");
exit;
}
} else {
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback';
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}
return $client;
}
/*
Destroy token
*/
class GetDestroyToken {
function get( ) {
unset($_SESSION['access_token']);
header("Location:/");
}
}
/*
Google oauth2callback
*/
class GetOauth2 {
function get() {
require_once 'assets/vendor/google-api-client/src/Google/autoload.php';
$client = new Google_Client();
$client->setApplicationName('');
$client->setClientId('');
$client->setClientSecret('');
$client->setRedirectUri('');
$client->setScopes(array(implode(' ', array(Google_Service_Calendar::CALENDAR, Google_Service_Drive::DRIVE))));
if (! isset($_GET['code']) ) {
$auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
$client->authenticate($_GET['code']);
$_SESSION['access_token'] = $client->getAccessToken();
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}
}
}
函数doGoogleAuth(){
需要_once“assets/vendor/googleapi client/src/google/autoload.php”;
$client=新的Google_客户端();
$client->setApplicationName(“”);
$client->setClientId(“”);
$client->setClientSecret(“”);
$client->setAccessType('offline');
$client->setRedirectUri('http://'.$\u SERVER['http\u HOST'.]./oauth2callback');
$client->setScopes(数组(内爆(“”,数组(谷歌服务日历::日历,谷歌服务驱动器::驱动器)));
如果(isset($\会话['access\ u token'])&&$\会话['access\ u token'])){
$client->setAccessToken($_会话['access_token']);
如果($client->isAccessTokenExpired()){
$error=“您的谷歌安全令牌出现错误。若要获取新的安全令牌,请执行以下操作。”;
包括(“view/error.php”);
出口
}
}否则{
$redirect_uri='http://'。$_SERVER['http_HOST']./oauth2callback';
标题('Location:'.filter_var($redirect_uri,filter_SANITIZE_URL));
}
返回$client;
}
/*
销毁令牌
*/
类GetDestroyToken{
函数get(){
取消设置($_会话['access_token']);
标题(“位置:/”;
}
}
/*
谷歌oauth2callback
*/
类GetOauth2{
函数get(){
需要_once“assets/vendor/googleapi client/src/google/autoload.php”;
$client=新的Google_客户端();
$client->setApplicationName(“”);
$client->setClientId(“”);
$client->setClientSecret(“”);
$client->setRedirectUri(“”);
$client->setScopes(数组(内爆(“”,数组(谷歌服务日历::日历,谷歌服务驱动器::驱动器)));
如果(!isset($\u GET['code'])){
$auth_url=$client->createAuthUrl();
标题('Location:'.filter_var($auth_url,filter_SANITIZE_url));
}否则{
$client->authenticate($_GET['code']);
$\会话['access\u token']=$client->getAccessToken();
$redirect_uri='http://'。$_SERVER['http_HOST'].//';
标题('Location:'.filter_var($redirect_uri,filter_SANITIZE_URL));
}
}
}
用户首次对应用程序进行身份验证时,您应该会得到一个refreshtoken。您需要使用refreshtoken在新的访问令牌到期时获取新的访问令牌。不幸的是,我还没有找到任何关于如何做到这一点的教程。但是当用户第一次授权你的应用程序时,你应该会得到一个刷新令牌。您需要使用refreshtoken在新的访问令牌到期时获取新的访问令牌。不幸的是,我还没有找到任何关于如何做到这一点的教程。但这应该会给谷歌带来一些东西