家族ToDo(仮)開発日誌

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

開発日誌 (9) : セキュリティと利便性を両立するOAuth2.0認証シーケンス (その2)

今回の進捗

  • Web側のユーザ登録・認証処理仮実装
  • Android端末(Genymotion)からローカル端末の自前Webを参照するためのhosts設定
  • Andorid端末から自前Webを経由してOAuthし、結果をDB登録した後、独自認証キーを返却するまでの一連の通し動作確認

作業時間: 4h

ユーザ登録・認証処理の仮実装

前回の日誌で示したシーケンスのフィジビリティをとるために、最低限必要なWeb側の機能をやっつけ実装する。

↓の図の1〜7までは前回までで終わっているので、8〜10が対象となる。

f:id:ymkn:20140217001435p:plain

8: 独自認証キーの発行

いわゆるセッションキーであるので、それなりに気をつけたい。気をつけるべきポイントは下記の通り。(なんか個人サイトだけど、IPAが言っているのと同じことを書いているような気がしたのでIPAのサイトを調べ直したりしてない)

1.推測困難なセッション ID を利用する
2.セッション ID を URL に含めない
3.HTTPS 通信で利用する Cookie には secure 属性を付与する
4-1.ログイン後にセッションを新規に開始する
4-2.ログイン後にセッション ID とは別の秘密情報を持ち、各ページでその値をチェックする

参考: セッション管理の不備と対策 | Webセキュリティの小部屋

1、2についてはアクセストークンをSeedにして乱数生成すればいいだろう。3はCookie使わないのでアレだが、通信はHTTPSで行うのは必須。4-1、4-2はいずれかを対応すれば良いので、今回は4-1を採用する。Android端末から認証のために認証キーが送られてきて認証が成功する度に、新規の認証キーを生成して払い出すようにすれば良い。

9: アクセストークンとメールアドレス、認証キーをDBに保存

googleから得られたJSONjson_decode関数を使ってデコードし、結果をPDOでDBにINSERTする。認証時も同様にPDOでメールアドレスを条件にSELECTし、見つかったら認証キーとともにユーザ情報をJSONエンコードしてカスタムスキーマのURLへリダイレクトする。

以下、30分くらいはまったのでメモ。

PDOでエラー時に例外を生成するようにする

PDOの属性PDO::ATTR_ERRMODEにPDO::ERRMODE_EXCEPTIONを指定すれば良い。デフォルトでは何もエラーはかないので大変困る。エラー内容を確認できなかったのでPDO::prepareメソッドでPDOStatementクラスがうまく生成されない原因に気づくのに時間が掛かった。ちなみに原因はINSERT文中の列名の誤り。prepareメソッドでそんなところまでチェックするんだね。すごい。

json_decode関数はstdClassを返す

そもそもstdClassって何?と最新のPHP事情について行けていない自分がいるが、身も蓋もない言い方をすれば、連想配列のキーをpublicフィールドとして持つ単純クラス、ということでしょうか。JavaなんかのObjectクラスに相当するとか聞いたけど、メソッドとかもっているかまでは調べてない。

ちなみに第2引数にtrue (trueって・・) を指定するとイメージ(?)通り連想配列を返してくれる。

10: カスタムスキーマを使い、認証キーを返却

カスタムスキーマなURLにリダイレクトしてResponseとしてJSON吐けばいいだけじゃん、とか思ってたら、うまくリダイレクトできなくて悲しい。というのも、Androidの実行環境としてGenymotionを使っているので、localhost:8888/ほげほげとかににリダイレクトしようとすると、当然ながらAndroid端末内のlocalhostへリダイレクトしてしまうのだった。

GoogleのWeb Application向けのredirect URLにIPアドレスを指定できない

じゃあ母艦のIPアドレスを直接指定すればいいじゃんと192.168.ほげほげとかを指定すると、今度はGoogleのOAuthリダイレクトURLのチェックではじかれるのだった。またか・・Googleよ。kazokutodo.example.comなどドメインの形式であればOKのようなので、Google側はそれで登録した。

Genymotion上のAndroid端末のrootを取得する

問題はAndroidから上記URLを使ってリダイレクトさせる方法だが、hosts書き換えれば一発OKであるものの、Android上のhostsを書き換える方法に苦戦。rootはGenymotionのAndroid上にインストール済みのGenymotion Configurationアプリを使用することで簡単に取得できるのだが、hostsをAndroid端末上で修正する方法がわからないのであった。エディタとか無いしね。

Genymotion上のAndroid端末にGoogle Playストアをインストールする

というわけでHost Editorアプリをインストールしたかったのだが、APKからのインストールでもGoogle Playアプリが必要とのことで、下記サイトを参考にインストールを敢行。今まで使っていたAndroid 4.1.1の端末にはうまくインストールできなかったので、4.2.2の端末を作り直してそちらでやり直すとうまくいった。

参考:[Android]GenymotionにGoogle Playを入れる | hello-world.jp.net

晴れてAndroidから母艦のWebサーバへリダイレクトできるようになった。

日誌の整理が必要かも

しかし開発日誌と銘打ってはいるものの殴り書きのメモに近い状態になってきたので、ここらで一休みして記事の整理をしていく必要がある気がした。コード片の記載もスクリーンショットも少ないので、単なる妄想日記に見えないこともないし。