家族ToDo(仮)開発日誌

やりたいことや行きたい場所を家族で共有するためのAndoridアプリの開発日誌(兼Android開発学習メモ)です。

開発日誌 (5) : OAuthでログイン (Googleからメールアドレスとユーザ名を取得)

今回の進捗

  • JavaのOAuthライブラリscribeの導入
  • ログイン画面の追加 (テンプレから不要要素削除しただけの張りぼて)
  • OAuthを使ってGoogleからユーザ情報とメールアドレスの取得
  • 取得した情報のメイン画面への表示


作業時間: 3h

Googleアカウントを使ってログイン (OAuth 2.0)

何かサービスを作る度にユーザ管理・認証のしかけを再発明しているのにうんざりしていたが、最近OAuthが一般的になってきておりこれらを外部サービスに丸投げできるのがうれしい。

厳密にはOAuthはService Providerのサービスに対する認可機能まで持っているので、単に認証だけに使いたい場合にはオーバースペックというか実装具合によってはSPのサービスよび放題なのである種の脆弱性にもなり得ると言うことで最近はOAuth 2.0から認証部分(とベーシックなユーザ情報とか)だけを取り出してまとめたOpenID Connectという規格がはやり始めている模様。ちょっと調べたがサンプルが少なかったのでとりあえずOAuth 2.0ベースで実装を進め、後にOpenID Connectに修正する方向で進める。

OAuthで目的の認証情報を得るにはSPの提供する認証画面をたたいてコールバックを受けなければならない。そのため多少複雑な実装*1が必要となる。

とかく面倒なのは嫌いなので簡単にできるライブラリがないか探したところ、scribe-javaというのがある模様。下記サイトにはこれを用いたGoogleに対するOAuthの実装例まであるのでとりあえずこれを丸パクりして動作確認をしてみる。

参考: AndroidからGoogle OAuthでプロフィール情報にアクセスする方法

ポイントととしては、

  • UIスレッドから呼ばない (別スレッド処理・非同期処理が必要)
  • SPからのコールバックに使うActivityには、AndroidManifest.xmlandroid:launchMode="singleTask"属性を付与し、Intent Filterでコールバック先と指定していたURLを割り当ててあげる必要がある (サンプルでは単にoauth://callback/としているが、他アプリとかち合わないように名前空間でも入れておいた方が良い)

サンプルコードに載っていないsecretTokenの保存・復元処理だけ書き足して実行すると、見事に動作。ユーザ情報の入ったJSONを取得できた。あとはこのJSONを解釈してUserクラスのインスタンスを作って、Intentを使用してメイン画面へ運べばよい。

↓メイン画面で表示してみた(モザイクだらけで分けわからんな)。

f:id:ymkn:20140203000346p:plain
f:id:ymkn:20140203000357p:plain
f:id:ymkn:20140202235739p:plain

Activityに依存しているコードとそうでないコードがごっちゃになっていることと、できればスレッドではなく非同期メソッド (Login画面のテンプレコードで使われているやつ) を使ってみたいのでこの辺はToDoとして次回へ。

*1:第4回でやったようなJSONのデコード・エンコードに比べれば、という程度だが