Google Accountに紐づいたサービスの利用

Google Accountに紐づいたサービスを利用する場合、よく使われるのがOAuth2.0と呼ばれる認証方式です。アプリ自体がユーザの大切なパスワードを管理することなく、Google Accountの情報にアクセスすることが可能になります。
先日のGDD2011のBreakoutセッションがとっても分かりやすかったのでリンクしておきます。
Google Developer Day 2011 Japan: 「データアクセスと本人認証のための OAuth と OpenID」


・・・が実はOAuth2.0を使う以外のユーザ認証をするケースが存在します。それがGoogle BookmarksGoogle Web Historyです*1

これらのサービスを利用する (中身を閲覧する) 場合、OAuth2.0ではなくCookieを使います。参考にしたサイトはこちら。


前者の方のアプローチはとても興味深いです。ログイン画面のHTMLをGET、パースしてからアカウント、パスワードをPOSTした上でCookieを取り込んでいます。でもこれだとアプリがアカウント情報を知らなくてはいけなくなります。こういう情報はあまり教えてほしくないなぁと思っていたところ、違う実現方法が分かりました。

とても単純なことです。WebViewでログイン画面を表示して、ログインした後Cookieを取得すれば、実質アプリはユーザの大事なアカウント情報にノータッチで済むことになります。*2


ということで簡単なサンプルを作ってみました。
Cookie Viewerというもので、Google Accountのログイン画面表示します。そこにアカウント情報を入力してログインしたら、Cookie情報をリスト表示するものです。


◆ 初期画面 (右の鍵アイコンでログイン画面に遷移)

◆ ログイン画面

Cookie表示画面


このCookieを使えば、BookmarksやWeb Historyにアクセスすることが出来そうです。でもこのCookie、取扱いは非常に慎重に行う必要があります。永続化するのであれば、パーミッションの設定や暗号化は絶対に行うべきでしょう。


いつものようにソースコードはこちらに公開しています。
調子に乗ってCompatibility Packageを使ってます。

CookieSample

後日談

あれからいろいろ試してみて、Web履歴が取得出来るようになりました。
ですが、ここで取得出来るCookieですが、15分ほどで無効になってしまうんですね。。。
たしかにログイン画面で以下のようにかかれています。


なるほど。たしかにその通りです。
ということは、WebViewを使ってユーザにログインしてもらうのではなく、アカウント情報を事前に入力してもらい、裏でログイン→Cookie取得→Web履歴取得を行うしかなさそうです。

Cookieは永続化せず、オンメモリ上に取っておく。そのCookieでもWeb履歴を取れなくなったらもう一度ログインしてCookieを取り直す。

こんなところでしょうかね。


ちなみに参考にさせていただいたサイトはこちら。

*1:間違ってたらごめんなさい

*2:ユーザ的には入力していることに変わりありませんが