如何使用GoogleOAuth2、CalendarAPI和PHP处理过期的访问密钥?

如何使用GoogleOAuth2、CalendarAPI和PHP处理过期的访问密钥?,php,google-api,Php,Google Api,尽管我已经尽了最大的努力阅读了手册,但我还是对谷歌的日历API和OAuth 2的授权感到困惑。我正在使用Google PHP客户端库 我有一个web应用程序,它成功地将事件添加到Google日历中。我的问题是,一个小时后,用户的访问密钥过期,导致添加新日历事件失败 我添加了一个讨厌的解决方案,它检测密钥过期并显示一个错误页面。然后,用户单击错误页面中的一个链接,该链接将取消访问令牌并拉下一个新令牌 我的理想解决方案是让用户在选择注销之前保持身份验证 我能问一下我在下面的过程中遗漏了什么,使我无法

尽管我已经尽了最大的努力阅读了手册,但我还是对谷歌的日历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在新的访问令牌到期时获取新的访问令牌。不幸的是,我还没有找到任何关于如何做到这一点的教程。但这应该会给谷歌带来一些东西