プロジェクト

全般

プロフィール

Bug(バグ) #3416

自動ログインCookieを有効にしてログインしているブラウザで新規登録を実行すると member/registerInput で404エラーとなる

Youichi Kimura10年以上前に追加. 約7年前に更新.

ステータス:
Won't fix(対応せず)
優先度:
Normal(通常)
担当者:
対象バージョン:
開始日:
2013-10-04
期日:
進捗率:

0%

3.6 で発生するか:
Yes (はい)
3.8 で発生するか:
Yes (はい)

説明

Overview (現象)

  1. 自動ログインを有効にして にログインする
  2. 友人を招待する (/invite) 画面から招待メールを送信する
  3. 届いたメールに書かれている招待 URL (/member/register) を開く
  4. 「プロフィール入力ページへ」(/member/registerInput) ボタンをクリックする
  5. 404 エラーが表示される

Causes (原因)

#1100 では新規登録時にログイン中のセッションがあった場合に削除する処理が追加されているが、自動ログインが有効な場合が考慮されていない。そのため member/register までは正常に表示されるが、次の画面に遷移したところで自動ログイン Cookie によりログイン状態となってしまう。

Way to fix (修正内容)

member/register アクション内に自動ログイン Cookie を失効させる処理を追加する

autologin.png 表示 (82.1 KB) Yuya Watanabe, 2013-12-05 14:45

flow.png 表示 (103 KB) Yuya Watanabe, 2013-12-12 16:04


関連するチケット

関連している OpenPNE 3 - Backport(バックポート) #3497: 自動ログインCookieを有効にしてログインしているブラウザで新規登録を実行すると member/registerInput で404エラーとなる Fixed(完了) 2013-10-04
関連している OpenPNE 3 - Backport(バックポート) #3498: 自動ログインCookieを有効にしてログインしているブラウザで新規登録を実行すると member/registerInput で404エラーとなる Fixed(完了) 2013-10-04

関係しているリビジョン

リビジョン 2cac338f (差分)
Youichi Kimura10年以上前に追加

revoke automatic login cookie before registration (fixes #3416)

リビジョン eb5fe39f (差分)
Youichi Kimura10年以上前に追加

use empty string to clear member cache (fixes #3416)

リビジョン 8fbdf778 (差分)
Youichi Kimura10年以上前に追加

revoke automatic login cookie on registration pages using register_token (fixes #3416)

履歴

#1 Youichi Kimura10年以上前に更新

  • 説明 を更新 (diff)

#2 Youichi Kimura10年以上前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

更新履歴 2cac338f0edd68b57d534413e54d4b4380237a83 で適用されました。

#3 Mutsumi Imamura10年以上前に更新

  • 3.6 で発生するかUnknown (未調査) から Yes (はい) に変更
  • 3.8 で発生するかUnknown (未調査) から Yes (はい) に変更

#4 Yuya Watanabe10年以上前に更新

  • ファイル auto_login.png を追加
  • ステータスPending Review(レビュー待ち) から Rejected(差し戻し) に変更

フィードバック内容

$this->serializedMember の上書きに関して, 84 行目のように if の条件式で false になればよいですが,既存の実装ではキャッシュが空であることを空文字列で表しているようであり文字列のみを扱えば良い状態ですがここで扱われるべきデータに null が追加されるのが気になるため空文字列で初期化してください.

lib/user/opSecurityUser.class.php
   84:     if ($this->serializedMember)
lib/user/opSecurityUser.class.php
   23:     $serializedMember = '';
   42:     $this->serializedMember = '';
   99:         $this->serializedMember = serialize($member);

レビューメモ

opSecurityUser#setMemberId() が呼ばれる段階

  • sfContext の初期化時
  • executeRegister() および executeRegisterInput() 実行時

opSecurityUser#getMember() で opSecurityUser にメンバ情報がメモリにキャッシュされる. sfContext 初期化時には opSecurityUser がインスタンス化される段階で setMemberId() された上で getMember() を呼んでいるためこの段階でキャッシュされる. setMemberId() でこのキャッシュを削除しない状態だと getMember() は sfContext 初期化時にキャッシュされたメンバが取得されるため(また,このメンバは is_remember_me の Cookie があることから is_active=1 であるはずであり opAuthAdapterMailAddress の) isRegisterBegin() が false となり 404 に遷移する.

期待される内容としては

  • opSecurityUser の getMember() が現在のメンバIDに対応するメンバ情報を取得する
  • セッションの member_id が現在のメンバIDを表している

という前提だと問題としては opSecurityUser から取得されるメンバ ID がキャッシュの ID とセッションにある ID で一致しないということであることになる.

対応方法としては下記のものが考えられる.
  • getMember() を行う際にメンバ情報をキャッシュしない
  • sfContext の初期化時に正しく setMemberId() を行うようにする
  • executeRegister() および executeRegisterInput() 実行時に呼ばれる setMemberId() でキャッシュを削除する

この内 getMember() でキャッシュしないようにすることは getMember() の呼ばれる頻度から正しい対応とは言えない.また setMemberId() でキャッシュである serialiedMember を上書きすることが 3 番目の対応となり, executeRegister() で logout() に変更することが executeRegisterInput() 時における 2 番目の対応ということになるはず.setMemberId() を行うかは URL やパラメータなどによって決定されるため sfContext の初期化時点ではセットされる member_id が正しく決定できないと思うため修正内容としては妥当ではあるがリクエスト時に一瞬でも以前のメンバでログイン状態となるところは気になる.(ユーザが明示的な操作を行わない限りはメンバのステートは次のリクエストの sfContext 初期化時までを含むという考え方を持ってないと気になる)

参考

sfContext 初期化時における setMemberId までの流れ

getRememberedMemberId() の中で Cookie を見て対応する member_id を DB から取得してくる. 得られた member_id を帰って来た initializeUserStatus() でセッションに保存する.

#5 Yuya Watanabe10年以上前に更新

#6 Yuya Watanabe10年以上前に更新

  • ファイル を削除 (auto_login.png)

#7 Youichi Kimura10年以上前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

更新履歴 eb5fe39f5619e7bcac973ca61bd32a94bfa28090 で適用されました。

#8 Yuya Watanabe10年以上前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

#9 Mutsumi Imamura10年以上前に更新

  • ステータスPending Testing(テスト待ち) から Rejected(差し戻し) に変更
  • 進捗率70 から 50 に変更

招待からの登録の場合と異なり、新規登録(ログイン画面の新規登録をクリック)で登録フローを行うと招待メールに記載されているURLをクリックすると /member/registerInput にリダイレクトされます。
(招待された場合は「プロフィールを入力する」の/member/register/ の画面に遷移します。)
この場合、今回追加したログアウト処理をスキップしてしまうため、登録完了させると自動ログインでログイン済みのユーザーになってしまいます。
招待の場合とフローを合わせる、選択肢もありますが、ユーザーが履歴などから直接 /member/registerInput にアクセスする可能性もありますので、
/member/registerInput にアクセス時もログアウト処理を追加するようにしてください。

#10 Youichi Kimura10年以上前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

更新履歴 8fbdf778cd6133103bbf08a261928893a8c2eb0d で適用されました。

#11 Youichi Kimura10年以上前に更新

/member/register 以外の /member/registerInput, /opAuthMailAddress/registerEnd 等に直接遷移した場合であってもセッションを失効させるために、各アクションで使用する opSecurityUser::setRegisterToken() 内で logout() を呼び出すよう修正しました。

#12 Yuya Watanabe10年以上前に更新

図に含まれてないものとして, member/login 時に registerBegin であれば member/registerInput に遷移する可能性がありますが基本的には registerInput でやれば問題無さそうですね.

#13 Yuya Watanabe10年以上前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

#15 isao sano約7年前に更新

  • ステータスPending Testing(テスト待ち) から Won't fix(対応せず) に変更
  • 進捗率70 から 0 に変更

OpenPNE 3.8.10 にて対応済みであったため、対応せずとします。

他の形式にエクスポート: Atom PDF