2013年4月13日土曜日

[CakePHP]他のサイトを経由するとセッションが切れてしまう件への対処

自分の場合は、ブックマークレットを使用し、自分のドメイン以外のサイトから、自分のサイトの画面を開くようにしているときにこの問題が発生した。

ここで
外部サイトに接続して戻って来ると、セッション情報が失われている

説明されているよう、、session.referer_checkが有効となるため、発生するようだ。
なので、ここでで説明されているよう、
Sessions

core.phpで以下をいれ,

Configure::write('Session.save','my_session');

同ディレクトリにmy_session.phpを配置する。
中には、ある状況では、 session.referer_checkは無効になるようにした。 なので、if文などで、ある状況には以下が実行されるようにする。こんな感じで正規表現でマッチングしてもいいかもしれない。本当はアクセス先URLではなく、遷移元URLで判別できたほうがいいだろうけど。

if(preg_match("/^models\/action/",$_GET['url'])){
 ini_set('session.referer_check', '');
}

ちなみに、もし、ブックマークレットからアクセスする自サイトの画面が認証を必要とする画面の場合、CakePHPの機能で、$this->Auth->loginActionで指定したアクションに自動的にリダイレクトされる。 なので、このloginActionで指定したURLへのアクセス自にも上記のsession.referer_checkを無効となるように設定したほうがいい。 なぜなら、loginActionにリダイレクトさた時点で、session.referer_checkが発動しセッション情報が失われるので、Auth.redirectに保存されたURLがなくなってしまうからだ。

 Auth.redirectとは、認証が必要なページに未ログイン状態でアクセスすると、そのURLを保存してくれるものだ。CakePHPはログイン後にこの値を取り出しもともと開こうとしていたURLにリダイレクトしてくれるのだ。 このAuth.redirectが空だと、Cakeはwebrootにリダイレクトしてしまう。 loginActionへのsession.referer_checkを無効にしてあげれば、きちんと保持してくれる。

あとブックマークレットを作っている方は、ブックマークレットから呼び出しているjavascriptやcssをcakephpで動的に出力している場合は、これらのURLへのアクセスも許容しておく必要がある。これらのコントローラー、アクションが起動した段階で、session.referer_checkが発動してしまうからだ。通常、JSやCSSは静的なファイルでWebrootに配置しているので問題ないと思う(webrootの静的なファイルへのアクセスでは発動しない模様。)が、動的にjsやcss内のURLを書き換える等のトリッキーな使い方をしている人もいると思うので。

 ちなみに、Auth.redirectは$this->Auth->redirect()で取得できる。 なので、リダイレクトする際は以下のようにする。OAuthの場合は、コールバックURLになっているアクションで。
$this->redirect($this->Auth->redirect());
でもCakeのドキュメントには、「通常、 AuthComponent は認証が実行されるまえのコントローラ/アクションのペアを記憶しており、認証が成功したらユーザをそこにリダイレクトします」って書いてあって、まるで自動的にリダイレクトしてくれるように書いてるんですよねー。 自分はOAuthを使ってるから、自動的ではないのかなぁ。

0 件のコメント:

コメントを投稿