Bug(バグ) #1985
Yuya Watanabe さんが約13年前に更新
h3. Overview
Cookie for automatic login is deleted when automatic login is done.
(自動ログイン時に自動ログイン用のCookieが削除される。)
h3. Way to repro
1. SNSに自動ログインを有効にしてログイン
2. ブラウザ終了
3. 同ブラウザでSNSにアクセス (自動ログイン・この時点でCookie消失)
4. 同ブラウザ終了
5. 同ブラウザでSNSにアクセスするとログイン画面になる。
h3. Environment
OpenPNE3.6.x 〜
h3. Causes
opBaseSecurityUser::isValidSiteIdentifier()
がセッション無効時に false を返す。そのため、同クラス initialize() により
ログアウト処理が実行され、自動ログイン用Cookieが削除される。
その後、自動ログインの処理が実行されるため、再現方法 3 の時点では
ログインすると考えられる。
h3. Way to fix
opBaseSecurityUser::isValidSiteIdentifier() について セッションが無いときは
true を返すように変更
h2. 上記修正後 #1182 で再度発生した問題について
h3. 概要
ログイン時に自動ログインにチェックを入れているにも関わらず,次回自動ログインは成功するが,その次の自動ログインに失敗する.
失敗する原因として自動ログイン用のCookieが削除されていることが確認されている.
#1182 の修正によって再度発生するようになった.
h3. 再現手順
# SNSに自動ログインを有効にしてログイン
# ブラウザ終了
# 同ブラウザでSNSにアクセス
# 同ブラウザ終了
# 同ブラウザでSNSにアクセス
** ログアウト状態となっている
h3. 問題までの処理の流れ
# メンバが「次回から自動的にログイン」にチェックをいれてログインする
** 自動ログイン用のCookieと今回限りのログイン用のCookieがサーバから送られてきてブラウザに保存される
# ブラウザを終了する
** 今回限りのログイン用Cooikeが削除されるが自動ログイン用Cookieは残ったままとなる
# ブラウザを立ち上げてSNSにアクセスする
** 最初は未ログイン状態となりopAnonymousMemberのインスタンスが生成される
** opAnonymousMember生成時にログアウト処理が行われて自動ログイン用Cookieを削除する処理が行われる
** ブラウザから送られて来た自動ログイン用Cookieを用いてopRememberLoginFilterがログインに成功する
** ログインを完了してSNSを表示したときには今回限りのログイン用Cookieが存在するが自動ログイン用Cookieが削除されている状態となる
# ブラウザを終了する
** 今回限りのログイン用Cookieが削除されてなにもない状態となる
# ブラウザを立ち上げてSNSをにアクセスする
** opAmonymouseMemberとしてログイン画面にリダイレクトされる
h3. 原因
#1182 で修正されたコミット( commit:decc4e2d )以降のソースで下記部分においてopAnonymousMemberのインスタンス生成時にログアウト処理が行われるように修正されたため.
lib/user/opSecurityUser.class.php 330行目
<pre>
321 /**
322 * Initializes all credentials associated and status with this user.
323 */
324 public function initializeUserStatus()
325 {
326 opActivateBehavior::disable();
327 $member = $this->getMember();
328 opActivateBehavior::enable();
329
330 if ($member instanceof opAnonymousMember || $member->getIsLoginRejected())
331 {
332 $this->logout();
333 $isSNSMember = false;
334 }
335 else
336 {
337 $isSNSMember = (bool)$member->getIsActive();
338 }
339
340 $this->setIsSNSMember($isSNSMember);
341 if ($isSNSMember)
342 {
343 $member->updateLastLoginTime();
344 }
345 }
</pre>
h3. 修正方針
opRememberLoginFilterを廃止し,Memberオブジェクトが初期化される際にopAnonymousMemberかどうかでログアウト処理を行うときと同じタイミングで自動ログインの判定を行う方針とする.
h3. 参考
調査を行ったログ: http://redmine.openpne.jp/issues/1985#note-13