SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend FrameworkでGoogleアプリケーションを使い倒す

PHPアプリケーションからGoogle Calendarを利用しよう(前編)

Zend FrameworkでGoogleアプリケーションを使い倒す(2)

ダウンロード sample.zip (1.9 KB)

Googleカレンダの認証(①~③)

 さて、いよいよサンプルコードの作成に入りましょう。

 前回紹介したYouTube動画検索では、GoogleサービスであるYouTubeからデータを取得するだけでしたので、ユーザーの認証は必要ありませんでした。しかし、今回は特定のカレンダーにアクセスし、データの登録、変更を行うため、ユーザーの認証が必要となります。

 Google Calendar がサポートしている認証方式には以下の2つがあります。

認証方法
認証方法 概要
ClientLogin 認証情報をアプリケーションに含める。インストールするアプリケーション向き。
AuthSub 認証情報をブラウザ上でユーザーが入力する。ウェブアプリケーション向き。

ClientLogin

 今回は複数人が同じアカウントのGoogle Calenderデータにアクセスすることになりますので、認証情報をコードに含めるClientAuthで認証を行うことにします。

[リスト3]index.php(抜粋)
// 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の値
クラス名 AUTH_SERVICE_NAMEの値 使用されるGoogle API
Zend_Gdata_Books print 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メソッドを使用します。以下が主な引数の説明です。

getHttpClientメソッドの引数
引数 省略時の値 内容
$email 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を作成します。

[リスト4]URIの作成(index-AuthSub.php抜粋)
$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関数
getAuthSubTokenUri(string $next, string $scope, int $secure, int $session, string $request_uri)

 関数の各引数は以下です。

getAuthSubTokenUri関数の引数
引数 省略時の値 内容
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
サービス フィードの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の認証に誘導します。

図6:ログイン画面
図6:ログイン画面

 

 ここで下記のようなエラーが出る場合、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アカウントとパスワードを入力します。

図7:Googleログイン画面
図7:Googleログイン画面

[3]アクセス要求

 PHPアプリケーションがGoogleカレンダーにアクセスすることを許可するか求められます。許可をクリックすることで処理がPHPアプリケーションに戻ります。

図8:アカウント要求
図8:アカウント要求

[4]シングルトークンの取得とセッショントークンの生成

 Googleアカウントの認証が成功するとPHPアプリケーションに処理が戻り、Single-useのトークンがGoogleサーバから発行されます。このトークンを元にセッショントークンを作成します。

[リスト5]セッショントークンの作成(index(AuthSub).php抜粋)
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クライアントを生成します。

[リスト6]セッショントークンの作成(index(AuthSub).php抜粋)
// Google とやり取りするための、認証済みHTTPクライアントを作成
$client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['cal_token']);

 以降は、ClientLogonと同様にCalendarサービスのインスタンス作成を行います。

次のページ
カレンダーリストの取得(④)

この記事は参考になりましたか?

Zend FrameworkでGoogleアプリケーションを使い倒す連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 森山 絵美(モリヤマ エミ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3816 2009/05/07 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー