Googleカレンダの認証(①~③)
さて、いよいよサンプルコードの作成に入りましょう。
前回紹介したYouTube動画検索では、GoogleサービスであるYouTubeからデータを取得するだけでしたので、ユーザーの認証は必要ありませんでした。しかし、今回は特定のカレンダーにアクセスし、データの登録、変更を行うため、ユーザーの認証が必要となります。
Google Calendar がサポートしている認証方式には以下の2つがあります。
| 認証方法 | 概要 |
| ClientLogin | 認証情報をアプリケーションに含める。インストールするアプリケーション向き。 |
| AuthSub | 認証情報をブラウザ上でユーザーが入力する。ウェブアプリケーション向き。 |
ClientLogin
今回は複数人が同じアカウントのGoogle Calenderデータにアクセスすることになりますので、認証情報をコードに含めるClientAuthで認証を行うことにします。
// ClientAuth 認証用のパラメータ【①】 $user = "account@gmail.com"; $pass = "password"; $gdataCal = Zend_Gdata_Calendar::AUTH_SERVICE_NAME; // 認証済みHTTPクライアント作成【②】 $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $gdataCal); // Calendarサービスのインスタンス作成【③】 $gdataCal = new Zend_Gdata_Calendar($client);
[1]認証用パラメータを設定
認証用パラメータとしてGoogleのアカウント(メールアドレス)とパスワード、サービス名を設定します。$gdataCalにはZend_Gdata_Calendarクラスの定数であるAUTH_SERVICE_NAMEが設定していますが、これは「cl」という値を持っています。
各サービスのクラス(GoogleカレンダーであればZend_Gdata_Calendar、GoogleスプレッドシートであればZend_Gdata_Spreadsheets)ではこのAUTH_SERVICE_NAMEという定数が定義されており、GoogleのData APIに接続する際に、どのAPIを使用するかを示すサービス名になります。そのクラスのAUTH_SERVICE_NAMEを指定すれば自動的に適切なAPIを選択できるようになるため、あまり気にすることはないかもしれませんが、参考までにどのような値が入っているかは以下を参照してください。
| クラス名 | AUTH_SERVICE_NAMEの値 | 使用されるGoogle API |
| Zend_Gdata_Books | Book Search Data API | |
| Zend_Gdata_Calendar | cl | Calendar Data API |
| Zend_Gdata_Docs | writely | Documents List Data API |
| Zend_Gdata_Photos | lh2 | Picasa Web Albums Data API |
| Zend_Gdata_Spreadsheets | wise | Spreadsheets Data API |
| Zend_Gdata_YouTube | youtube | YouTube Data API |
[2]認証済みのHTTPクライアントを作成
前回解説したように、Zend_GdataではHTTPクライアントを介して、GoogleサービスとPHPアプリケーションとのデータ交換を行います。
HTTPクライアント(Zend_Http_Clientオブジェクト)を取得するにはZend_Gdata_ClientLoginクラスのgetHttpClientメソッドを使用します。以下が主な引数の説明です。
| 引数 | 型 | 省略時の値 | 内容 |
| string | (必須) | GoogleアカウントとなるEメールアドレス。 | |
| $password | string | (必須) | Googleアカウントのパスワード。 |
| $service | string | xapi | サービス名(xapiはGoogle Dataサーバの汎用的なサービス名)。 |
| $client | Zend_Gdata_HttpClient | null | 生成した結果を格納すべきHTTPクライアントオブジェクト。 |
| $loginToken | string | null | サーバから払いだされたCAPTCHAチャレンジ用文字列。CAPTCHAとはランダムな文字列を機械では読み取れないような歪んだ画像で表示し、ユーザーを人間に限定するもの。 |
| $loginUri | string | https://www.google.com/accounts/ClientLogin | リクエストの送信先URI。 |
[3]Calendarサービスのインスタンス作成
認証済みのHTTPクライアントを引数としてZend_Gdata_Calendarインスタンスを生成します。このオブジェクトを通じて、先ほど認証用に設定したアカウント情報でGoogleカレンダーサービスにログインして操作するのと同様のデータ更新、取得ができるようになります。
AuthSub
今回はこちらの認証方法は使用しません。ただし、Zend_GdataでPHPアプリケーションを作成する場合にAuthSub認証の方が適している場合ももちろんありますので以下に解説します。今回のサンプルを理解するだけでしたら不要ですので、読み飛ばしても構いません。
[1]ログインURIの作成
認証を行うGoogleのURIを作成します。
$uriRedirect = 'http://'. $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; $uriCalendar = 'http://www.google.com/calendar/feeds/ '; $uriGoogleAuth = Zend_Gdata_AuthSub::getAuthSubTokenUri($uriRedirect, $uriCalendar, 0, 1); echo "<h1>会議室予約ページ</h1>"; echo "<a href='$uriGoogleAuth'>ログイン</a>";
getAuthSubTokenUri関数は、認証を行うGoogleのURIを生成します。認証を行うことでSingle-useトークンが発行されます。
getAuthSubTokenUri(string $next, string $scope, int $secure, int $session, string $request_uri)
関数の各引数は以下です。
| 引数 | 型 | 省略時の値 | 内容 |
| next | string | (必須) | 認証後のリダイレクト先となるURL。 |
| scope | string | (必須) | アプリケーションがアクセスできるフィードの範囲。 |
| secure | int | 0 | 発行すべきトークンがsecureな場合1、secureでない場合0。 |
| session | int | 0 | Single-useのトークンをセッショントークンに変換する場合1、しない場合0。 |
| request_uri | string | https://www.google.com/accounts/AuthSubRequest | 認証の要求先となるURI。 |
scopeについては今回のGoogleカレンダーの場合は「http://www.google.com/calendar/feeds/」を指定しています。その他のサービスの場合は以下を指定してください。また、複数のフィードにアクセスする場合は空白(%20)で連結します。
| サービス | フィードのURL |
| Google Book Search | http://www.google.com/books/feeds/ |
| Google Calendar | http://www.google.com/calendar/feeds/ |
| Google Documents | http://docs.google.com/feeds/ |
| Google SpreadSheets | http://spreadsheets.google.com/feeds/ |
| Picasa Web Albums | http://picasaweb.google.com/data/feed/ |
| YouTube | http://gdata.youtube.com |
これにより次のような画面を表示させ、ユーザーをGoogleの認証に誘導します。
ここで下記のようなエラーが出る場合、php.iniの設定値output_bufferingがOffとなっている可能性があります。設定値をOn、またはバイト値(最大4,096)を指定しましょう。
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at ***) in *** Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at ***) in ***
[2]Googleユーザー認証
Googleのユーザー認証画面に転送され、次のような画面が表示されます。ここでユーザーはGoogleアカウントとパスワードを入力します。
[3]アクセス要求
PHPアプリケーションがGoogleカレンダーにアクセスすることを許可するか求められます。許可をクリックすることで処理がPHPアプリケーションに戻ります。
[4]シングルトークンの取得とセッショントークンの生成
Googleアカウントの認証が成功するとPHPアプリケーションに処理が戻り、Single-useのトークンがGoogleサーバから発行されます。このトークンを元にセッショントークンを作成します。
if (isset($_GET['token'])) {
// 認証後リダイレクトされたときはここに
// single-use トークンをセッショントークンに変換
$session_token = Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
// セッショントークンをセッションに保存
$_SESSION['cal_token'] = $session_token;
[5]認証済みHTTPクライアントの作成
ClientLoginの場合はユーザーアカウント情報を元に認証済みHTTPクライアントを作成しましたが、AuthSubの場合はセッショントークンを元に認証済みHTTPクライアントを生成します。
// Google とやり取りするための、認証済みHTTPクライアントを作成 $client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['cal_token']);
以降は、ClientLogonと同様にCalendarサービスのインスタンス作成を行います。



