我使用Google Calendar API在fullcalendar上显示事件(因此在我的视图中使用json对象)。我使用codeigniter php框架,控制器中有几个函数来创建新的客户机,然后在oauth2callback()函数中使用它来将代码交换为access_token,然后开始调用gcalendar()和gCalendar_events中的服务。我已经将accessType设置为脱机,但这似乎并不能使我脱机访问事件。它工作得很好,只是每次会话结束时我都被重定向为再次登录。我不希望那样,我希望它们在会话结束后一直显示。我试图在access_token过期的情况下使用刷新令牌,看看这是否能解决问题。
这是我控制器里的代码
function getClient() {
$client = new Google_Client();
$client->setApplicationName("DL Calendar");
$client->setAuthConfig('application/client_secrets.json');
$client->addScope('profile');
$client->setIncludeGrantedScopes(true);
$client->setAccessType('offline');
return $client;
}
function gcalendar() {
$this->load->add_package_path(APPPATH . 'vendor/autoload');
$client = $this->getClient();
//$client->setRedirectUri(site_url('calendar/index'));
$client->addScope(Google_Service_Calendar::CALENDAR);
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$client->setAccessToken($_SESSION['access_token']);
$access_token = $_SESSION['access_token'];
$service = new ]Google_Service_Calendar($client);
$calendar = new Google_Service_Calendar_Calendar();
//$calendarList = $service->calendarList->listCalendarList();
$calendar = $service->calendars->get('primary');
$params = array(
'owner_id' => get_current_user_id(),
'title' => get_current_user(). ' ' .'Google Calendar',
'type' => 'gcal',
'url' => $calendar->id,
);
$calendar_id = $this->Calendar_model->add_calendar($params);
redirect('calendar/index');
} else {
$redirect_uri = site_url('calendar/oauth2callback');
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}
$this->session->set_flashdata('success', 'Event Successfully Added');
}
函数oauth2callback(){
//Build the client object
$client = $this->getClient();
$client->addScope(Google_Service_Calendar::CALENDAR);
$service = new Google_Service_Calendar($client);
$url = parse_url($_SERVER['REQUEST_URI']); parse_str($url['query'], $params);
$code = $params['code'];
//To exchange an authorization code for an access token, use the authenticate method:
if (! isset($code)) {
$auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
$token = $client->fetchAccessTokenWithAuthCode($code);
$client->setAccessToken($token);
$client->authenticate($code);
$_SESSION['access_token'] = $client->getAccessToken();
$redirect_uri = site_url('calendar/gcalendar');
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}
function gcalendar_events() {
$client = $this->getClient();
$client->addScope(Google_Service_Calendar::CALENDAR);
// $client->setRedirectUri(site_url('calendar/gcalendar'));
$client->setAccessType('offline'); //need calendar events to appear even if not logged in to google
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$client->setAccessToken($_SESSION['access_token']);
$access_token = $_SESSION['access_token'];
$service = new Google_Service_Calendar($client);
$id = 'primary';
$calendar = new Google_Service_Calendar_Calendar();
$calendar = $service->calendars->get('primary');
$event = new Google_Service_Calendar_Event();
$events = $service->events->listEvents($id);
foreach ($events->getItems() as $event) {
$startTime = strtotime($event->getStart()->dateTime) ;
$endTime = strtotime($event->getEnd()->dateTime);
$start = date('Y-m-d H:i:s', $startTime);
$end = date('Y-m-d H:i:s', $endTime);
$eventsArr[] = array(
'title' => $event->getSummary(),
'start'=> $start,
'end' => $end,
);
}
// Return a single `events` with all the `$eventsArr`
echo json_encode($eventsArr);
}
}
下面是我使用的代码
if ($client->isAccessTokenExpired()) {
$refresh_token = $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
$client->setAccessToken($refresh_token);
$_SESSION['access_token'] = $refresh_token;
$this->load->helper('file');
write_file('application/client_secrets.json', json_encode($client->getAccessToken()));
} else {
$access_token = $_SESSION['access_token'];
}
我刚刚注意到,它曾经在我的授权中说“授予脱机访问权限”,但现在它不再提到,而谷歌文档说“在用户授予对所请求范围的脱机访问权限后,当用户脱机时,您可以继续使用API客户机代表用户访问谷歌API。客户机对象将根据需要刷新访问令牌。”
$token = $client->getAccessToken();
$authObj = json_decode($token);
if(isset($authObj->refresh_token)) {
save_refresh_token($authObj->refresh_token);
}
$client->refreshToken($your_saved_refresh_token);
$_SESSION['access_token'] = $client->getAccessToken();
我正试图在他过期后获得一个新的访问令牌。我已将收到的信息保存在银行中,作为第一次客户访问的回报: {"access_token":"TOKEN","refresh_token":"TOKEN","token_type","承载","expires_in": 3600,"创建": 1320790426} 令牌到期后,我需要申请一个新的令牌,我这样做: 问题是总是返回以下错误:刷新OAuth2令牌时出
我想使用谷歌作为OIDC协议的id提供商。我有一个简单的应用程序。它启动,正确地重定向到谷歌,然后返回到应用程序,打印用户详细信息并将其存储在会话中。但是,这种身份验证似乎来自id令牌,并且只有1h的过期时间 我的YML:
我面临一个问题,以刷新谷歌访问令牌在服务器端。 我从谷歌认证服务器得到的响应只是403状态代码。信息是这样的 仅仅为了刷新访问令牌,在我的服务器上使用SSL是强制性的吗?它已经在我的本地服务器上测试过,没有附加任何SSL到它。
调用execute方法时,它会引发以下异常: 谁能指出我哪里做错了?我能够从谷歌oAuth UI获得访问令牌。
任何人都可以告诉我通过 OAuth2 生成刷新令牌的到期时间。实际上,它通常返回 2 个参数访问令牌和刷新令牌。我们使用刷新令牌,以便在访问令牌过期时生成新的访问 toke。但是谷歌日历版本3,我正在使用刷新令牌来调用日历API。但是在这里我遇到了令牌过期的问题。所以任何人都可以建议我当令牌过期时我该怎么办。据我说,刷新令牌没有过期时间。请检查下面的代码以使用刷新令牌创建日历服务:-
我的网站上有一个php应用程序,允许我的用户使用我的谷歌日历计划/重新安排日历事件,所以我不需要用户通过谷歌认证自己。我已经完成了获取令牌和存储刷新令牌的工作,但现在当我尝试访问日历时,我收到一个错误消息,说我的令牌已过期。输出为 创建客户端时发现访问令牌={“access_token”:“long…token…string”,“token_type”:“Bearer”,“expires_in”: