プロジェクト

全般

プロフィール

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

戻る