刷新令牌 Google OAuth 2.0 PHP

3
使用此网站https://github.com/google/google-api-php-client提供的Google OAuth 2.0代码。
我需要帮助将刷新令牌编码到以下代码中,我不确定如何做到这一点,有很多资源可用,但我找不到任何可以帮助我将其整合到我的代码中的资源。当前问题是,如果我让令牌过期,它会给我一个错误,说我没有刷新令牌,我需要它,因为我不想使用force选项来获取accesstype。我正在使用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();
  }
?>
2个回答

2

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

$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_in值,您可以使用以下代码:

$json = json_decode($client->getAccessToken());
echo $json['expires_in'];

请注意,expires_in是相对于令牌创建时间的,因此要检查令牌是否过期,您需要使用:

$expired = ($json['created'] + $json['expires_in']) < time();

过期时间命令在哪里?我把它放在代码的哪个位置有关系吗? - jm874327
添加了关于 isAccessTokenExpired 的注释 - Hans Z.
我相信有一个命令expires_in:()可以告诉我们刷新token何时过期。您知道这个命令放在哪里吗? - jm874327
添加了一个示例 - Hans Z.
谢谢,你之前用过这个吗?我在将它与我的代码集成时遇到了麻烦。请问我应该把它放在代码的哪个位置?另外,你知道有没有使用这些刷新令牌的可行演示吗? - jm874327
您需要将刷新令牌存储在数据库中吗? - jm874327

0

虽然这是一个老问题,但我希望这仍然可以帮助到某些人。 以下是我为服务器端令牌刷新(无需用户登录)所遵循的步骤。

  1. 在Google开发者控制台应用程序中,创建一个新的OAuth客户端ID,使用'https://developers.google.com/oauthplayground'作为重定向URI。 (您需要此项来进行游乐场中的身份验证)
  2. https://developers.google.com/oauthplayground/中,单击右上角的设置图标并选中“使用自己的OAuth凭据”。您必须插入有效的凭据(客户端ID和客户端密钥),如点1生成的那样。
  3. 在左列中选择并授权您的API(“步骤1”)
  4. 一旦您获得了授权码,请将其交换为令牌(“步骤2”)
  5. 现在,您可以在脚本中使用客户端ID、客户端密钥(与点2中使用的相同)和刷新令牌(在点4中获得的令牌)。

这是我正在使用的工作代码(例如Analytics):

$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');

这个刷新令牌是从哪里来的?我以为刷新令牌是在用户登录时生成的,因此它将是一个唯一的令牌。如果我错了,请纠正我。 - jm874327
你是正确的,在我的例子中不需要用户登录。我刚刚更新了我的答案。 - Sir_Faenor
那么,如果我从playground获取了刷新令牌,它会在一个小时后自动刷新已登录的用户吗?刷新令牌的有效期是多久? - jm874327
在我的应用程序中,当我需要调用API时,我会通过刷新令牌来请求一个新的访问令牌。据我所知,刷新令牌不会过期。 - Sir_Faenor
你能解释一下我如何从playground获取刷新令牌吗?它可以是随机的刷新令牌,还是需要特定于我的客户端ID? - jm874327

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接