スパイスラボ神部です。
前回のブックマークレットのエントリ とも関係あるのですが、Web サービスに1度ログインさせて、そこから長期にわたってログインさせておくためのノウハウというのは結構無いような気がします。とりあえず目の前の会員認証のところを解決する部分について言及しているものはたくさんあるのですが、それらを長期的に運用するにあたっては、あとからわかる問題でもあり、対応が難しかったりもします。
自分は CakePHP を使って実装していることもあり、そのあたりの情報を探したのですがそちらもあまり見あたりません。そうなるとソースコードをあたるしかないのですが、せっかくフレームワークを使っているのにできればソースコードを直接あたりたくはない!というちょっと後ろ向きな姿勢で、ブックマークレットと長期ログインしっぱなしなサービスの設計について考えてみたいと思います。
今回何が問題か
今回何が問題かということを最初に書いておくと、自動ログインさせるさい、自動ログインだけではなく、そのときのリクエスト URL も引っ張り回さなければいけないというところが大きな壁になっています。
そうなんです。自動ログインさせるところは全然簡単なのですが、
・その状態を長期保持させること(セキュリティ的な問題は考慮しつつ)
・自動ログインの課程で、ログイン前のリクエストURLの情報を失うことなくログイン処理を済ませ、またもとのリクエストURLに戻すこと
が必要です。
はてなブックマークでは、とりあえずログインしたらブックマークしたページのURLを失ってしまった、ということも最近体感したこともないので、おそらくはそのへんうまく撮り回していますが、CakePHP の場合はどのようにそのような挙動を実装すべきだろうか、というところが、今回の話題です。
原因の分析
ちょっと自分では追い切れなかったので、CakePHP のフォーラムに助けを求めてみました。
-"自動ログインさせたときの Request_URL の取り回し" フォーラム - CakePHP Users in Japan
対策のシナリオ・・・解決しました!
すると MASA-P さんより、auth.php の関係ありそうな場所をご指摘いただく。周辺のソースコードより、このような方法 にて一時的に元の $url の値を待避させることで対応出来ました。
ちなみに、redgasuki さんからも別の解決案をご呈示いただきました。beforeFilter の中で自動ログインさせるって感じでしょうか。こちらの方がスマートなので、次回はぜひこちらでやってみようと思います。
関連ありそうな情報
自動ログインも含め、関係ありそうな情報をひとつずつ拾っていきます。
-"amazonみたいな自動ログイン 初心者向け(?)" フォーラム - CakePHP Users in Japan
-CakePHP Passportコンポーネント Identifyの実装とAuthの分離|Cryptrial
その他もろもろ
-クッキー(Cookie) :: 主要なコンポーネント :: マニュアル :: 1.2 Collection :: The Cookbook
-「情報を保存する」オプションを有効にする(CakePHP修行 #34) - IDEA*IDEA ~ 百式管理人のライフハックブログ ~
ブログ内関連エントリ
-CakePHP の自動ログインの実装について調べてみました。 ( ラボブログ )
まとめ
ということで、今回の問題は無事解決しました!
auth.php の流れも追えたので、今までちょっとちんぷんかんぷんだった AuthComponent の処理も少しわかった気がします。それから Cake の処理上では $controller なんて変数もあるんですね。
なにかの参考になりましたら。
関連記事


