当前位置: 首页 > 知识库问答 >
问题:

使用刷新令牌的Google日历API

仲涵亮
2023-03-14

我的网站上有一个php应用程序,允许我的用户使用我的谷歌日历计划/重新安排日历事件,所以我不需要用户通过谷歌认证自己。我已经完成了获取令牌和存储刷新令牌的工作,但现在当我尝试访问日历时,我收到一个错误消息,说我的令牌已过期。输出为

创建客户端时发现访问令牌={“access_token”:“long…token…string”,“token_type”:“Bearer”,“expires_in”:3600}出现错误:(0)OAuth 2.0访问令牌已过期,刷新令牌不可用。对于自动批准的响应,不会返回刷新令牌。

不知道为什么我会收到此错误。

function getAccessToken(){
$tokenURL = 'https://accounts.google.com/o/oauth2/token';
$postData = array(
    'client_secret'=>'My-Secret',
    'grant_type'=>'refresh_token',
    'approval_promt'=> 'force',
    'refresh_token'=>'My-Refresh-Token',
    'client_id'=>'My-Client-ID'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $tokenURL);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$tokenReturn = curl_exec($ch);
return $tokenReturn;
}

function outputCalendarByDateRange($client, $startDate='2007-05-01', $endDate='2007-08-01'){
  date_default_timezone_set("America/Chicago");
  $client->addScope('https://www.googleapis.com/auth/calendar');
  try {
    $service = new Google_Service_Calendar($client);
  }catch(Google_ServiceException $e){
    print "Error code :" . $e->getCode() . "\n";
    print "Error message: " . $e->getMessage() . "\n";
  } catch (Google_Exception $e) {
    print "An error occurred: (" . $e->getCode() . ") " . $e->getMessage() . "\n";
  }

  $optParams = array(
    'orderBy'=>'starttime',
    'singleEvents'=>False,
    'timeMax'=>$endDate,
    'timeMin'=>$startDate,
    'timeZone'=>'America/Chicago',
    'maxResults'=>1000
  );

  try{
    $events = $service->events->listEvents('primary',$optParams);
  } catch (Google_ServiceException $e) {
    print "Error code :" . $e->getCode() . "\n";
    print "Error message: " . $e->getMessage() . "\n";
  } catch (Google_Exception $e) {
    print "An error occurred: (" . $e->getCode() . ") " . $e->getMessage() . "\n";
  }

  foreach ($events->getItems() as $event) {
    echo $event->getSummary();
  }
}

echo "creating a client<br>";
$client = new Google_Client();
$accessToken = getAccessToken();
echo "found access token = ".$accessToken."<br>";
try{
  $client->setAccessToken($accessToken);
}
catch (Google_ServiceException $e) {
    print "Error code :" . $e->getCode() . "\n";
    print "Error message: " . $e->getMessage() . "\n";
  } catch (Google_Exception $e) {
    print "An error occurred: (" . $e->getCode() . ") " . $e->getMessage() . "\n";
}
outputCalendarByDateRange($client, $today, $tomorrow);

共有1个答案

邰德业
2023-03-14

您应该考虑使用服务号来执行此操作。服务号将允许您的应用程序访问您的Google日历数据,而无需提示用户进行访问。

创建服务帐户时,使用它提供的电子邮件地址,并像添加其他用户一样将其添加到Google日历中。然后脚本就可以访问它了。

    <?php
session_start();        
require_once 'Google/Client.php';
require_once 'Google/Service/Calendar.php';     
/************************************************   
 The following 3 values an befound in the setting   
 for the application you created on Google      
 Developers console.         Developers console.
 The Key file should be placed in a location     
 that is not accessable from the web. outside of 
 web root.   

 In order to access your GA account you must    
 Add the Email address as a user at the     
 ACCOUNT Level in the GA admin.         
 ************************************************/
$client_id = '1046123799103-nk421gjc2v8mlr2qnmmqaak04ntb1dbp.apps.googleusercontent.com';
$Email_address = '1046123799103-nk421gjc2v8mlr2qnmmqaak04ntb1dbp@developer.gserviceaccount.com';     
$key_file_location = '629751513db09cd21a941399389f33e5abd633c9-privatekey.p12';     
$client = new Google_Client();      
$client->setApplicationName("Client_Library_Examples");
$key = file_get_contents($key_file_location);    
// seproate additional scopes with a comma   
$scopes ="https://www.googleapis.com/auth/calendar.readonly";   
$cred = new Google_Auth_AssertionCredentials(    
    $Email_address,      
    array($scopes),     
    $key         
    );      
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {        
    $client->getAuth()->refreshTokenWithAssertion($cred);       
}       
$service = new Google_Service_Calendar($client);    

?>

<html><body>

<?php
$calendarList  = $service->calendarList->listCalendarList();
print_r($calendarList);
while(true) {
    foreach ($calendarList->getItems() as $calendarListEntry) {
        echo "<a href='Oauth2.php?type=event&id=".$calendarListEntry->id." '>".$calendarListEntry->getSummary()."</a><br>\n";
    }
    $pageToken = $calendarList->getNextPageToken();
    if ($pageToken) {
        $optParams = array('pageToken' => $pageToken);
        $calendarList = $service->calendarList->listCalendarList($optParams);
    } else {
        break;
    }
}    

?>
</html> 

代码从教程谷歌日历应用编程接口用PHP服务帐户抓取

 类似资料:
  • 任何人都可以告诉我通过 OAuth2 生成刷新令牌的到期时间。实际上,它通常返回 2 个参数访问令牌和刷新令牌。我们使用刷新令牌,以便在访问令牌过期时生成新的访问 toke。但是谷歌日历版本3,我正在使用刷新令牌来调用日历API。但是在这里我遇到了令牌过期的问题。所以任何人都可以建议我当令牌过期时我该怎么办。据我说,刷新令牌没有过期时间。请检查下面的代码以使用刷新令牌创建日历服务:-

  • 我使用Google Calendar API在fullcalendar上显示事件(因此在我的视图中使用json对象)。我使用codeigniter php框架,控制器中有几个函数来创建新的客户机,然后在oauth2callback()函数中使用它来将代码交换为access_token,然后开始调用gcalendar()和gCalendar_events中的服务。我已经将accessType设置为脱

  • 我的问题是如何使用OAuth2.0从刷新令牌中获取访问令牌。我还没有找到任何从刷新令牌中获取访问令牌的例子。 我参考了[Google+API参考],但他们使用HTTP方法提到了它。2请用C#提供一些使用Google+API提供的方法的例子。

  • 我以前在一个OAuth2应用程序中工作过,其中的逻辑是在旧的访问令牌过期后通过刷新令牌生成新的访问令牌。 如果访问令牌在30分钟后过期,然后您只需要传入刷新令牌(但没有重新生成),那么刷新令牌的意义是什么?

  • 我想根据保存在数据库中的“刷新令牌”获得一个新的“访问令牌”。 请求{“error”:“invalid_grant”} 我在php脚本中使用相同的CLIENT_ID、CLIENT_SECRET和“refresh token”,在“访问令牌”过期时,我设法使用“refresh token”获得新的“访问令牌”。 我基于javadoc.google-oauth-java-client编写了代码。 UP