質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Q&A

解決済

1回答

3723閲覧

Google Calendar APIで、access token取得後、ユーザーのデータを取得できるまでに約20分のタイムラグがある。

退会済みユーザー

退会済みユーザー

総合スコア0

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

2グッド

2クリップ

投稿2016/02/11 15:22

###前提・実現したいこと
Laravel5.1を使い、Google Calendar APIでWebアプリを作っています。
ユーザー認証まではできたのですが、ユーザーのデータ取得でつまづいています。

###発生している問題
OAuth -> access token取得まではできています。有効なaccess tokenを使っています。
しかし、そのaccess tokenでユーザーのデータを取得しようとすると、下記のエラーが出ます。
ところが、約20分経つと、エラーは出ず、ユーザーのデータ取得に成功します。
このタイムラグは一体何が原因なのでしょうか。

###エラーメッセージ
Google_Service_Exception in REST.php line 123:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}

###ソースコード

php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6 7use App\Http\Requests; 8use App\Http\Controllers\Controller; 9use Google_Service_Calendar; 10use Exception; 11use Google_Client; 12use Redirect; 13 14class GoogleLoginController extends Controller 15{ 16 17 public function initial(){ 18 require_once base_path() . '/vendor/autoload.php'; 19 20 session_start(); 21 22 23 $client = new Google_Client(); 24 $client->setAuthConfigFile(base_path() . '/client_secret.json'); 25 $client->addScope(Google_Service_Calendar::CALENDAR_READONLY); 26 27 // $_SESSIONにaccess_tokenがあるならば 28 if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { 29 30 $client->setAccessToken($_SESSION['access_token']); 31 32 $options = array( 33 CURLOPT_RETURNTRANSFER => true, // return web page 34 CURLOPT_HEADER => false, // don't return headers 35 CURLOPT_FOLLOWLOCATION => true, // follow redirects 36 CURLOPT_MAXREDIRS => 10, // stop after 10 redirects 37 CURLOPT_ENCODING => "", // handle compressed 38 CURLOPT_USERAGENT => "test", // name of client 39 CURLOPT_AUTOREFERER => true, // set referrer on redirect 40 CURLOPT_CONNECTTIMEOUT => 120, // time-out on connect 41 CURLOPT_TIMEOUT => 120, // time-out on response 42 ); 43 $current_access_token = $_SESSION['access_token']['access_token']; 44 $ch = curl_init('https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=' . $current_access_token); 45 curl_setopt_array($ch, $options); 46 $content = curl_exec($ch); 47 curl_close($ch); 48 49 $decoded_content_object = json_decode($content); 50 51 // access tokenが有効ならば 52 if (isset($decoded_content_object->issued_to)) { 53 54 $service = new Google_Service_Calendar($client); 55 // 設定日時(2015-09-01T00:00:00+09:00)から3つのイベントをプリント 56 $calendarId = 'primary'; 57 $optParams = array( 58 'maxResults' => 3, 59 'orderBy' => 'startTime', 60 'singleEvents' => TRUE, 61 'timeMin' => '2015-09-01T00:00:00+09:00', 62 ); 63 $results = $service->events->listEvents($calendarId, $optParams); 64 $events = $results->getItems(); 65 foreach ($events as $key => $event) { 66 echo $event->getSummary(); echo "<br>"; 67 echo $event->getLocation(); echo "<br>"; 68 echo $event->start->dateTime; echo "<br>"; 69 echo $event->end->dateTime; echo "<br>"; 70 } 71 // access tokenが有効でないならば 72 } elseif (isset($decoded_content_object->error)) { 73 74 // access tokenが有効期限切れならば 75 if ($client->isAccessTokenExpired()) { 76 77 $refresh_token = '1/lsWyz_Tvf8R0s2ab8Fg7f7rfxiYN25ooercB47hVCctIgOrJDtdun6zK6XiATCKT'; 78 79 // refreshToken()が失敗したならばsessionを削除し、再度認証へ 80 if (isset($client->refreshToken($refresh_token)['error'])) { 81 82 $_SESSION = array(); 83 if (ini_get("session.use_cookies")) { 84 $params = session_get_cookie_params(); 85 setcookie(session_name(), '', time() - 42000, 86 $params["path"], $params["domain"], 87 $params["secure"], $params["httponly"] 88 ); 89 } 90 session_destroy(); 91 92 $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback'; 93 header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); 94 exit; 95 } 96 97 $client->refreshToken($refresh_token); 98 99 $service = new Google_Service_Calendar($client); 100 101 // Print the next 10 events on the user's calendar. 102 $calendarId = 'primary'; 103 $optParams = array( 104 'maxResults' => 1, 105 'orderBy' => 'startTime', 106 'singleEvents' => TRUE, 107 'timeMin' => '2015-09-01T00:00:00+09:00', 108 ); 109 $results = $service->events->listEvents($calendarId, $optParams); 110 $events = $results->getItems(); 111 foreach ($events as $key => $event) { 112 echo $event->getSummary(); 113 echo $event->getLocation(); 114 echo $event->start->dateTime; 115 echo $event->end->dateTime; 116 } 117 // ユーザーがでアクセス許可を無効にしたならば 118 } else { 119 120 $_SESSION = array(); 121 if (ini_get("session.use_cookies")) { 122 $params = session_get_cookie_params(); 123 setcookie(session_name(), '', time() - 42000, 124 $params["path"], $params["domain"], 125 $params["secure"], $params["httponly"] 126 ); 127 } 128 session_destroy(); 129 130 $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback'; 131 header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); 132 exit; 133 } 134 // その他のエラー 135 } else { 136 return "unknown error"; 137 } 138 // $_SESSIONにaccess tokenがないならば 139 } else { 140 $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback'; 141 header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); 142 exit; 143 } 144} 145 146public function callback(){ 147 require_once base_path() . '/vendor/autoload.php'; 148 149 session_start(); 150 151 $client = new Google_Client(); 152 $client->setAuthConfigFile(base_path() . '/client_secret.json'); 153 $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback'); 154 $client->addScope(Google_Service_Calendar::CALENDAR_READONLY); 155 $client->setAccessType('offline'); 156 157 if (!isset($_GET['code'])) { 158 $auth_url = $client->createAuthUrl(); 159 header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL)); 160 exit; 161 } else { 162 $client->authenticate($_GET['code']); 163 $access_token = $client->getAccessToken(); 164 $refresh_token = $client->getRefreshToken(); 165 $_SESSION['access_token'] = $access_token; 166 $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/calendars'; 167 header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); 168 exit; 169 } 170} 171

###補足情報
言語: PHP 5.6.13
フレームワーク: Laravel 5.1

act823, ikuwow👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Googleのオフィシャルドキュメントに下記のような記述がありました。
Note: Following a successful revocation response, it might take some time before the revocation has full effect.

すなわちrevokeには少し時間がかかる場合があるということです。それが、今回の私の環境では約20分であると考えられます。

投稿2016/03/01 13:47

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問