GoogleカレンダーAPIを使用してフルカレンダーでイベントを表示しています(ビュー内のjsonオブジェクトを使用)。私はcodeignitorのPHPフレームワークを使用しています。私は新しいクライアントを作成するために私のコントローラにいくつかの関数を持っています。次に、oauth2callback()関数を使ってaccess_tokenのコードを交換し、gcalendar() gcalendar_events。私はaccessTypeをオフラインに設定しましたが、それはオフラインでイベントにアクセスできるようには見えません。セッションが終了するたびに再度ログインするようにリダイレクトされている点を除けば、素晴らしいことです。私はそれを望んでいない、私は彼らがセッションが終了した後も常に表示するようにします。 access_tokenが期限切れになって問題が解決するかどうかを確認するために、リフレッシュトークンを使用しようとしています。GoogleカレンダーAPIがオフラインで機能していません。 codeigniterコントローラーでリフレッシュトークンを取得するには
これは私のコントローラのコード
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);
}
}
私のセッションが終了に問題ですか?またはアクセストークンが期限切れになり、リフレッシュトークンが必要ですか?どこでリフレッシュトークンを設定するのですか?なぜなら、1つ以上の場所に配置しようとしましたが、リフレッシュトークンをsetAccessTokenの一部として設定する必要があるというエラーメッセージが表示されます。私はそれをすべて入れて、まだエラーメッセージを持っています。ここで
は、私はちょうどそれがかつて言って私の許可の「オフラインアクセスを許可する」ために使用されることに気づいた 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'];
}
を使用したコードではありませんが、今、それはもはや言及しているGoogleのドキュメントは
を言いながら、ユーザーがリクエストされた範囲にオフラインでアクセスできるようにすると、ユーザーがオフラインのときに の代わりに APIクライアントを使用してGoogle APIにアクセスし続けることができます。クライアントオブジェクトは、必要に応じて アクセストークンを更新します。
dbでaccessTokenとrefreshTokenを保存して、それらを呼び出すか、これを行う方法を教えてください。 – nivanmorgan