刷新令牌Google OAuth 2.0 PHP

刷新令牌Google OAuth 2.0 PHP,php,oauth-2.0,google-oauth,Php,Oauth 2.0,Google Oauth,使用来自此站点的Google OAuth 2.0代码 我需要帮助将刷新令牌编码到以下代码中,我不确定如何做,有很多资源,但我找不到任何有助于我将其合并到代码中的资源。现在的问题是,如果我让令牌过期,它会给我一个错误,说我没有刷新令牌,我需要它,因为我不想对accesstype使用force选项。我正在使用php客户端: //include google api files require_once 'src/Google/Client.php'; require_once

使用来自此站点的Google OAuth 2.0代码

我需要帮助将刷新令牌编码到以下代码中,我不确定如何做,有很多资源,但我找不到任何有助于我将其合并到代码中的资源。现在的问题是,如果我让令牌过期,它会给我一个错误,说我没有刷新令牌,我需要它,因为我不想对accesstype使用force选项。我正在使用php客户端:

    //include google api files
    require_once 'src/Google/Client.php';
    require_once 'src/Google/Service/Oauth2.php';

    //start session
    $client_id = 'xxxx';
    $client_secret = 'xxxx';
    $redirect_uri = 'xxxxx';

    $client = new Google_Client();
    $client->setApplicationName("Backpack Em");
    $client->setClientId($client_id);
    $client->setClientSecret($client_secret);
    $client->setRedirectUri($redirect_uri);
    $client->setScopes(array('https://www.googleapis.com/auth/userinfo.email','https://www.googleapis.com/auth/userinfo.profile'));
    $client->setAccessType('offline');
    $service = new Google_Service_Oauth2 ($client);

 if (isset($_REQUEST['logout'])) {
  unset($_SESSION['upload_token']);
  $client->revokeToken();   //added
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));     //redirect user back to page
}

if (isset($_GET['code'])) {
  $client->authenticate($_GET['code']);
  $_SESSION['upload_token'] = $client->getAccessToken();
  $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];       header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}

if (isset($_SESSION['upload_token']) && $_SESSION['upload_token']) {
  $client->setAccessToken($_SESSION['upload_token']);
  if ($client->isAccessTokenExpired()) {
    unset($_SESSION['upload_token']);
  }
}

if ($client->getAccessToken()) 
  {
    //For logged in user, get details from google using access token
    $user           = $service->userinfo->get($params);
    //$user_id          = filter_var($user['id'],FILTER_SANITIZE_SPECIAL_CHARS);
    $user_name          = filter_var($user['name'], FILTER_SANITIZE_SPECIAL_CHARS);
    $first_name         = filter_var($user['given_name'], FILTER_SANITIZE_SPECIAL_CHARS);
    $last_name          = filter_var($user['family_name'], FILTER_SANITIZE_SPECIAL_CHARS);
    $email          = filter_var($user['email'], FILTER_SANITIZE_EMAIL);
    $profile_url        = filter_var($user['link'], FILTER_VALIDATE_URL);
    $profile_image_url      = filter_var($user['picture'], FILTER_VALIDATE_URL);
    $gender         = filter_var($user['gender'], FILTER_SANITIZE_SPECIAL_CHARS);
    $personMarkup       = "$email<div><img src='$profile_image_url?sz=50'></div>";
    $_SESSION['upload_token']   = $client->getAccessToken();
    $_SESSION['upload_token']   = $client->getRefreshToken();

  }

else
  {
  $authUrl = $client->createAuthUrl();
  }
?>
//包含google api文件
需要一次'src/Google/Client.php';
需要一次'src/Google/Service/Oauth2.php';
//开始会话
$client_id='xxxx';
$client_secret='xxxx';
$redirect_uri='xxxxx';
$client=新的Google_客户端();
$client->setApplicationName(“背包Em”);
$client->setClientId($client\u id);
$client->setClientSecret($client\u secret);
$client->setRedirectUri($redirect\u uri);
$client->setScopes(阵列)https://www.googleapis.com/auth/userinfo.email','https://www.googleapis.com/auth/userinfo.profile'));
$client->setAccessType('offline');
$service=新的Google\u服务\u Oauth2($client);
如果(isset($_请求['logout'])){
取消设置($_会话['upload_token']);
$client->revokeToken();//已添加
header('Location:'.filter_var($redirect_uri,filter_SANITIZE_URL));//将用户重定向回页面
}
如果(isset($_GET['code'])){
$client->authenticate($_GET['code']);
$\u会话['upload\u token']=$client->getAccessToken();
$redirect='http://'.$\u SERVER['http\u HOST'].$\u SERVER['PHP\u SELF'];头('Location:'。filter\u var('redirect,filter\u SANITIZE\u URL));
}
如果(isset($\u会话['upload\u token'])和&$\u会话['upload\u token'])){
$client->setAccessToken($_会话['upload_token']);
如果($client->isAccessTokenExpired()){
取消设置($_会话['upload_token']);
}
}
如果($client->getAccessToken())
{
//对于登录用户,使用访问令牌从google获取详细信息
$user=$service->userinfo->get($params);
//$user\u id=filter\u var($user['id'],filter\u SANITIZE\u SPECIAL\u CHARS);
$user\u name=filter\u var($user['name'],filter\u SANITIZE\u SPECIAL\u CHARS);
$first\u name=filter\u var($user['given\u name',filter\u SANITIZE\u SPECIAL\u CHARS);
$last\u name=filter\u var($user['family\u name',filter\u SANITIZE\u SPECIAL\u CHARS);
$email=filter\u var($user['email'],filter\u SANITIZE\u email);
$profile\u url=filter\u var($user['link'],filter\u VALIDATE\u url);
$profile\u image\u url=filter\u var($user['picture'],filter\u VALIDATE\u url);
$gender=filter\u var($user['gender'],filter\u SANITIZE\u SPECIAL\u CHARS);
$personMarkup=“$email”;
$\u会话['upload\u token']=$client->getAccessToken();
$\u会话['upload\u token']=$client->getRefreshToken();
}
其他的
{
$authUrl=$client->createAuthUrl();
}
?>

将刷新令牌存储在会话中,如下所示:

$refresh_token = $client->getRefreshToken();
$_SESSION['refresh_token'] = $refresh_token;
当您想要获得新的访问令牌时,您可以调用:

$refresh_token = $_SESSION['refresh_token'];
$client->refreshToken($refreshToken);
$access_token = $client->getAccessToken();
$_SESSION['upload_token'] = $access_token;
您可以调用
$client>isAccessTokenExpired()
查看访问令牌是否已过期,您需要触发刷新流

要打印/访问中的
expires\u值,您可以使用:

$json = json_decode($client->getAccessToken());
echo $json['expires_in'];
但是请注意,
中的
expires\u与令牌创建的时间有关,因此要检查令牌是否已过期,您需要使用:

$expired = ($json['created'] + $json['expires_in']) < time();
$expired=($json['created']+$json['expires_in'])
老问题,但我希望这仍然能帮助一些人。 以下是我为服务器端令牌刷新(用户无需登录)所遵循的步骤

  • 在Google开发者控制台应用程序中,使用“”作为重定向uri为OAuth创建新的客户端id。 (在操场上进行身份验证时需要此选项)
  • 在中,单击右上角的设置图标并选中“使用您自己的OAuth凭据”。您必须插入在第1点生成的有效凭据(客户端id和客户端机密)
  • 在左栏中选择并授权Api(“步骤1”)
  • 获得授权码后,将其交换为令牌(“步骤2”)
  • 现在,您可以在脚本中使用客户机id、客户机机密(与第2点使用的相同)和刷新令牌(第4点获得的)
  • 这是我正在使用的工作代码(用于分析,例如):


    expires in命令在哪里?我把它放在我的代码中的什么地方也很重要吗?在
    isAccessTokenExpired
    中添加了一个注释,我相信在:()中有一个命令expires\u来告诉刷新令牌何时过期。你知道它的用途吗?添加了一个示例谢谢,你以前用过这个吗?我无法将其与我的代码集成。我应该把这个放在我的代码里的什么地方?另外,您知道使用这些刷新令牌的工作演示吗?这个刷新令牌来自哪里?我认为刷新令牌是在用户登录时生成的,因此它将是唯一的令牌。如果我错了,请纠正我。您是对的,在我的示例中,您不需要用户登录。我刚刚更新了我的答案。所以如果我从playgroud获得刷新令牌,它会在一小时后自动刷新登录的用户?刷新令牌持续多长时间?在我的应用程序中,当我需要调用api时,我会发出一个访问令牌的新请求(通过刷新令牌)。据我所知,刷新令牌不会过期。您能解释一下我是如何从游乐场获得此刷新令牌的吗?它可以只是一个随机刷新令牌,还是需要特定于我的客户端id?
    $clientId = 'xxxxxxxxxxxxxxxxx'; // from google developer console
    $clientSecret = 'xxxxxxxxxxxxxx'; // from google developer console
    $refreshToken = 'xxxxxxxxxx'; // from https://developers.google.com/oauthplayground/
    $client = new Google_Client();
    $client->setClientId($clientId);
    $client->setClientSecret($clientSecret);
    $client->refreshToken($refreshToken);
    $access_token = $client->getAccessToken();
    $client->setAccessToken($access_token);
    $analytics = new Google_Service_Analytics($client);
    $response = $analytics->data_ga->get(
       'ga:' . xxxxxxx, 
       '7daysAgo',
       'today',
       'ga:sessions');