2016-10-19 1 views
0

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にアクセスし続けることができます。クライアントオブジェクトは、必要に応じて アクセストークンを更新します。

enter image description here

+0

dbでaccessTokenとrefreshTokenを保存して、それらを呼び出すか、これを行う方法を教えてください。 – nivanmorgan

答えて

0

私はこのOffline access in OAuth guideはあなたを助けるかもしれないと思います。 PHPを使用しているので、アクセスタイプを「オフライン」に設定してみてください。

アプリケーションは、GoogleのAPIへのオフラインアクセスを必要とする場合は、オフラインにAPIクライアントのアクセスタイプを設定します。

$client->setAccessType("offline"); 

要求されたスコープへのユーザー補助金オフラインでアクセスしたら、APIクライアントを使用し続けることができますユーザーがオフラインのときにユーザーのためにGoogle APIにアクセスするクライアントオブジェクトは必要に応じてアクセストークンを更新します。

+0

オフラインに設定していますが、DLカレンダーでカレンダーをオフラインで管理する権限が必要ですそれを言っていないと私はそれをオフになっているか分からない..私はそれを試してみましょう。 – nivanmorgan

関連する問題