まずは自作Spreadsheetからのデータ取得

Google Spreadsheets Data API Developer's Guideを参考に、自分のSpreadsheetからのデータ取得を目指す。

■Spreadsheetの作成
Create a spreadsheetに従って、まずはTaskListというSpreadsheetを作成。
カラム名は、とりあえず以下のようにした。

  • priority
  • title
  • status
  • startDate
  • limitDate
  • finishDate
  • note
  • tag
ところが、publishされていないSpreadsheetにアクセスするにはauthentication tokenとやらが必要らしい。正直、タスクリストはできればPublishしたくない。ので、Get an authentication tokenの項を読んで、認証方法を探してみる。
どうやらClientLoginとAuthSubという二つの認証方式が用意されている模様。詳細はGoogle Account Authenticationを見ろとのことで、結構面倒くさい。

・ClientLogin
 HTTPのPostリクエストで、EMailアドレス(アカウント名)・パスワード・アクセス先サービス名・アプリケーションの識別文字列などなどを送信し、レスポンスとして認証トークンを受け取るという方式。いったん認証トークンを受け取れば、以降はリクエストにこのトークンを付加することでGoogleサービスのデータを取得できるということらしい。
 Webアプリケーションでこの認証方式を利用する場合、Post先はGoogleドメインのサーバーなので、Googleサーバーにホストしない限りはクロスドメインのアクセスとなる。よって、XMLHttpRequestによるバックグラウンドのログインとかはできない。
 なので(だけかは知らないが)、基本的にこの方式はローカルコンピュータにインストールするようなクライアントアプリケーション向けとされている。

・AuthSub
 リクエストパラメータとしてリダイレクト先のURL(=自分のアプリのURL)を付与した上で、Googleの認証用ページにユーザーを飛ばし、ユーザーデータに対するアプリアクセスをユーザー自身に承認させるという方式。ユーザーが了解したら、付与されたリダイレクト先URLにtoken付きで飛ばす。仕組み上、サーバーサイドで動作するロジックがないとtokenを取得できないのでHTML+JavaScriptじゃ難しそうだ。主に、サーバーサイドの動作環境を持つWebアプリケーション向け。

 認証方式を色々試していて気づいたが、BloggerやGoogle Docs & Spreadsheetsで作業しつつブラウザのアドレスバーにフィードURIを打ち込んむと、Publishしていないデータに対してもアクセスできる。GoogleAccountにログインしていれば大丈夫ってことだろうか。

http://spreadsheets.google.com/feeds/list/key/worksheetId/private/full

これにアクセスできるかどうか、条件を変えて試してみたところ…
-Google Personalized Homeにログイン済み&Google Docs & Spreadsheetsには未ログイン
→ トークンがない、みたいな感じの認証エラーが出た
-Google Personalized Homeにログイン済み&Google Docs & Spreadsheetsにログイン済み
→ フィード取得成功
-いったんブラウザを終了し、再度アクセス
→ フィード取得成功
→ この状態でGoogle Docs & Spreadsheetsにアクセスすると、ログイン画面が出ずにいきなり文書一覧画面に。

 どうやら、Google Accountのログイン状態というのはサービスごとに保存されているみたいで、privateフィードが取得できるかどうかは、Google Docs & Spreadsheetsにログイン済みであるかどうかで決まる模様。おそらく、Google Docs & Spreadsheetsのログイン画面で「ログイン状態を保存」すると、認証トークンがCookieに保存されるのだと思われる。

■privateとpublicの違い
 どうも認証ロジックを組み込むのは面倒なので、別にタスクリストくらい見られてもいいからSpreadsheetはpublicにしてしまえばいい、と思っていた。が、publicにすると読み取り操作しかできなくなるらしい。ドキュメントには詳しく書いていなかったので、ざっと試したところ、こんな感じだった。

・public
-読み取り専用
-JSONによる取得可能

・private
-CRUD可能
-JSONによる取得不可能

 privateな(Publishしていない)Spreadsheetはpublicとしてアクセスできないのは言うまでもないが、publicな(Publishした)Spreadsheetをprivateとしてアクセスすることもできない。データを表示するところはJSONのが楽なんだが…。だからといってpublicにすると更新ができなくなるとはどういうことだ。これじゃろくなアプリが作れないぞ。データに対する更新操作が必要なら、Spreadsheetはprivateにするしかなさそうだ。がっかり。

コメント