プロジェクト

全般

プロフィール

Bug(バグ) #2333

携帯版を SSL が必須なアプリケーションに登録している場合に携帯でログイン出来ない

Shingo Yamada12年以上前に追加. 約4年前に更新.

ステータス:
Accepted(着手)
優先度:
Low(低め)
担当者:
-
対象バージョン:
開始日:
2011-08-03
期日:
進捗率:

0%

3.6 で発生するか:
Unknown (未調査)
3.8 で発生するか:
Unknown (未調査)

説明

Overview (現象)

config/OpenPNE.yml の ssl_required_applications に mobile_frontend を登録している場合に、携帯端末からの通常ログイン(メールアドレス, パスワードを使った認証)が出来ない。

上記設定の環境でログイン処理を行った場合、(リダイレクトが数回繰り返された後?)ログイン画面が再表示される。(エラーメッセージ無し。入力内容は保持されていない)

Causes (原因)

Way to fix (修正内容)


関連するチケット

関連している OpenPNE 3 - Bug(バグ) #2134: au の一部の端末でセッションが保持できない (ログインできない) New(新規) 2011-05-24

履歴

#1 Shingo Yamada12年以上前に更新

  • 360対象RC1 にセット

#2 Shingo Yamada12年以上前に更新

  • 優先度Normal(通常) から High(高め) に変更

#3 Shingo Yamada12年以上前に更新

  • 担当者Kousuke Ebihara から Yuya Watanabe に変更

担当者を変更します。

#4 Yuya Watanabe12年以上前に更新

  • ステータスNew(新規) から Accepted(着手) に変更

#5 Yuya Watanabe12年以上前に更新

本チケットに記載された情報をもとに手元の環境で再現を行おうとしましたが,報告された問題が確認できませんでした.以下に確認内容を示します.

確認環境

OpenPNE3.7.0-dev (master)
MacOSX 10.7.1
Firefox 6.0.2
FireMobileSimulator 1.2.2
  • DC P903i
  • AU W53CA
  • SB J-SH010
  • SB 930SH

確認手順

  1. OpenPNE3.7.0-devを通常通りインストールして管理画面で以下の設定を行う
    ・SNS設定->認証関連設定
    「PC・携帯両方から登録可」
    ・SNS設定->携帯関連設定
    「携帯電話のIP帯域をチェックしない」
  2. config/OpenPNE.ymlの編集を下記のように行う
    • use_sslをfalse, ssl_required_applicationsに"mobile_frontend"を含めない
    • use_sslをfalse, ssl_required_applicationsに"mobile_frontend"を含める
    • use_sslをtrue, ssl_required_applicationsに"mobile_frontend"を含めない
    • use_sslをtrue, ssl_required_applicationsに"mobile_frontend"を含める
  3. 「./symfony cc」を実行する
  4. Firefoxの「環境設定」->「プライバシー」->「履歴」の「サイトから送られてきたCookieを保存する」を以下のように設定する
    • チェックを入れる
    • チェックを外す
  5. Firefoxの「環境設定」->「プライバシー」->「履歴」の「Cookieを表示…」で「すべてのCookieを削除する」を行う
  6. クライアント側でFMSの機種を下記のように設定する
    • DC P903i
    • AU W53CA
    • SB J-SH010
    • SB 930SH
  7. OpenPNEのサイトの携帯版に下記のスキームでアクセスする
    • httpスキーム
    • httpsスキーム
  8. メンバのアドレス,パスワードを用いてログインしようとする
  9. ログインが完了しSNSのホームが表示されるかどうかを確認する

確認結果

Cooikeを保存しない設定の状態でAU W53CAおよびSB 930SHを用いてログインしようとした際に本チケットに記載された結果が得られました.他の設定の影響はありませんでした.その他状況においては正常にログインできたことを確認しました.この確認での懸念としては実機での確認は行っていないことが挙げられます.

#6 Yuya Watanabe12年以上前に更新

au実機を用いた際に再現したことを確認しました.

au機においてCookieを使いながらSSLを用いる実装が困難だったため, #2341 と同様にau機でありconfig/OpenPNE.ymlのuse_sslがtrueである場合にセッションIDをURLパラメータで引き回す実装を行うことを検討しました.

#7 Yuya Watanabe12年以上前に更新

調査結果

au実機でログイン出来ない状況について調査した結果を下記に記述します.

config/OpenPNE.yml内記述について.

  • 使用した実機はau機とsoftbank機
  • base_url, ssl_base_urlを設定
  • use_sslをtrueに設定
  • ssl_required_applicationsにはmobile_frontendを含まない
  • ssl_required_actionsにはデフォルトのままの状態である
    mobile_frontend: ["member/register", "member/registerInput", "member/registerEnd", "member/editProfile", "member/config", "member/login", "member/logout", "member/invite", "member/configUID"]
    

調査内容

dev環境で得られたログの一部を記載します.ログ開始はログイン画面を開いた状態でopAuthMailAddressによるログインで,
メールアドレスおよびパスワードが正しいものを入力したあとに「ログイン」ボタンをクリックしたところからとなります.
注目するところとしては最初のリダイレクトが発生した直後に認証に成功しているかどうかです.
au機の場合は最初のリダイレクト後に認証に失敗していますが,softbank機は最初のリダイレクト後に認証に成功しています.
つまり,リダイレクト時に認証情報が失われている可能性が考えられます.

  • au機
    Sep 18 16:31:42 symfony [info] {sfPatternRouting} Connect sfRoute "image_nodefaults" (/image/*)                        
    Sep 18 16:31:42 symfony [info] {sfPatternRouting} Connect sfRoute "image" (/cache/img/:format/:width_:height/:filename.:noice)
    Sep 18 16:31:42 symfony [info] {sfPatternRouting} Match route "login" (/member/login/*) for /member/login/authMode/MailAddress with parameters array (  'module' => 'member',  'action' => 'login',  'authMode' => 'MailAddress',)
     9月 18 16:31:43 symfony [info] {myUser} User is not authenticated
     9月 18 16:31:43 symfony [info] {myUser} User is not authenticated
     9月 18 16:31:43 symfony [info] {sfFilterChain} Executing filter "sfRenderingFilter" 
     9月 18 16:31:43 symfony [info] {sfFilterChain} Executing filter "opCacheControlFilter" 
     9月 18 16:31:43 symfony [info] {sfFilterChain} Executing filter "opCheckEnabledApplicationFilter" 
     9月 18 16:31:43 symfony [info] {sfFilterChain} Executing filter "sfBasicSecurityFilter" 
     9月 18 16:31:43 symfony [info] {sfFilterChain} Executing filter "sfDenyFromNonMobileFilter" 
     9月 18 16:31:43 symfony [info] {sfFilterChain} Executing filter "sfMobileIOFilter" 
     9月 18 16:31:43 symfony [info] {sfFilterChain} Executing filter "opEmojiFilter" 
     9月 18 16:31:43 symfony [info] {sfFilterChain} Executing filter "opExecutionFilter" 
     9月 18 16:31:43 symfony [info] {memberActions} Call "memberActions->executeLogin()" 
     9月 18 16:31:43 symfony [info] {myUser} User is not authenticated
     9月 18 16:31:43 symfony [err] {opDeprecatedRoute} This routing rule is deprecated. Please use other rules instead of this.
     9月 18 16:31:43 symfony [err] {opDeprecatedRoute} This routing rule is deprecated. Please use other rules instead of this.
     9月 18 16:31:43 symfony [info] {myUser} User is authenticated
     9月 18 16:31:43 symfony [info] {myUser} Add credential(s) "SNSMember" 
     9月 18 16:31:43 symfony [info] {opMobileFrontWebController} Redirect to "https://example.com:443/index.php/member/setSid?next_uri=member%2Fhome&is_remember_login=0&sid=skIkbgBcF0HZ5po9HGrvzISMjFgTuyaPqyiXDudY65I%3D&ts=1316331103" 
     9月 18 16:31:43 symfony [info] {opWebResponse} Send status "HTTP/1.1 302 Found" 
     9月 18 16:31:43 symfony [info] {opWebResponse} Send header "Location: https://example.com:443/index.php/member/setSid?next_uri=member%2Fhome&is_remember_login=0&sid=skIkbgBcF0HZ5po9HGrvzISMjFgTuyaPqyiXDudY65I%3D&ts=1316331103" 
     9月 18 16:31:43 symfony [info] {opWebResponse} Send header "Content-Type: text/html; charset=utf-8" 
     9月 18 16:31:43 symfony [info] {opWebResponse} Send content (241 o)
    Sep 18 16:31:44 symfony [info] {sfPatternRouting} Connect sfRoute "image_nodefaults" (/image/*)
    Sep 18 16:31:44 symfony [info] {sfPatternRouting} Connect sfRoute "image" (/cache/img/:format/:width_:height/:filename.:noice)
    Sep 18 16:31:44 symfony [info] {sfPatternRouting} Match route "member_setSid" (/member/setSid) for /member/setSid with parameters array (  'module' => 'member',  'action' => 'setSid',)
     9月 18 16:31:44 symfony [info] {myUser} User is not authenticated
     9月 18 16:31:44 symfony [info] {myUser} User is not authenticated
     9月 18 16:31:44 symfony [info] {sfFilterChain} Executing filter "sfRenderingFilter"                                   
     9月 18 16:31:44 symfony [info] {sfFilterChain} Executing filter "opCacheControlFilter" 
     9月 18 16:31:44 symfony [info] {sfFilterChain} Executing filter "opCheckEnabledApplicationFilter" 
     9月 18 16:31:44 symfony [info] {sfFilterChain} Executing filter "sfDenyFromNonMobileFilter" 
     9月 18 16:31:44 symfony [info] {sfFilterChain} Executing filter "sfMobileIOFilter" 
     9月 18 16:31:44 symfony [info] {sfFilterChain} Executing filter "opEmojiFilter" 
     9月 18 16:31:44 symfony [info] {sfFilterChain} Executing filter "opExecutionFilter" 
     9月 18 16:31:44 symfony [info] {memberActions} Call "memberActions->executeSetSid()" 
     9月 18 16:31:44 symfony [err] {opDeprecatedRoute} This routing rule is deprecated. Please use other rules instead of this.
     9月 18 16:31:44 symfony [err] {opDeprecatedRoute} This routing rule is deprecated. Please use other rules instead of this.
     9月 18 16:31:44 symfony [info] {opMobileFrontWebController} Redirect to "https://example.com:443/index.php/" 
     9月 18 16:31:44 symfony [info] {opWebResponse} Send status "HTTP/1.1 302 Found" 
     9月 18 16:31:44 symfony [info] {opWebResponse} Send header "Location: https://example.com:443/index.php/" 
     9月 18 16:31:44 symfony [info] {opWebResponse} Send header "Content-Type: text/html; charset=utf-8" 
     9月 18 16:31:44 symfony [info] {opWebResponse} Send content (108 o)
    
  • Softbank機
    Sep 18 16:34:31 symfony [info] {sfPatternRouting} Connect sfRoute "image_nodefaults" (/image/*)
    Sep 18 16:34:31 symfony [info] {sfPatternRouting} Connect sfRoute "image" (/cache/img/:format/:width_:height/:filename.:noice) 
    Sep 18 16:34:31 symfony [info] {sfPatternRouting} Match route "login" (/member/login/*) for /member/login/authMode/MailAddress with parameters array (  'module' => 'member',  'action' => 'login',  'authMode' => 'MailAddress',)
     9月 18 16:34:31 symfony [info] {myUser} User is not authenticated
     9月 18 16:34:31 symfony [info] {myUser} User is not authenticated
     9月 18 16:34:31 symfony [info] {sfFilterChain} Executing filter "sfRenderingFilter"                                   
     9月 18 16:34:31 symfony [info] {sfFilterChain} Executing filter "opCacheControlFilter"                                
     9月 18 16:34:31 symfony [info] {sfFilterChain} Executing filter "opCheckEnabledApplicationFilter"                     
     9月 18 16:34:31 symfony [info] {sfFilterChain} Executing filter "sfBasicSecurityFilter"                               
     9月 18 16:34:31 symfony [info] {sfFilterChain} Executing filter "sfDenyFromNonMobileFilter" 
     9月 18 16:34:31 symfony [info] {sfFilterChain} Executing filter "sfMobileIOFilter" 
     9月 18 16:34:31 symfony [info] {sfFilterChain} Executing filter "opEmojiFilter" 
     9月 18 16:34:31 symfony [info] {sfFilterChain} Executing filter "opExecutionFilter"                                   
     9月 18 16:34:31 symfony [info] {memberActions} Call "memberActions->executeLogin()"                                   
     9月 18 16:34:31 symfony [info] {myUser} User is not authenticated
     9月 18 16:34:31 symfony [err] {opDeprecatedRoute} This routing rule is deprecated. Please use other rules instead of this.  
     9月 18 16:34:31 symfony [err] {opDeprecatedRoute} This routing rule is deprecated. Please use other rules instead of this.  
     9月 18 16:34:31 symfony [info] {myUser} User is authenticated
     9月 18 16:34:31 symfony [info] {myUser} Add credential(s) "SNSMember"                                                 
     9月 18 16:34:31 symfony [info] {opMobileFrontWebController} Redirect to "https://example.com/index.php/member/setSid?next_uri=member%2Fhome&is_remember_login=0&sid=2BTNlCQFMp1kgb%2F9PWh2WRN8wK19aMiabl9xRG8xbb8%3D&ts=1316331271" 
     9月 18 16:34:31 symfony [info] {opWebResponse} Send status "HTTP/1.1 302 Found"                                       
     9月 18 16:34:31 symfony [info] {opWebResponse} Send header "Location: https://example.com/index.php/member/setSid?next_uri=member%2Fhome&is_remember_login=0&sid=2BTNlCQFMp1kgb%2F9PWh2WRN8wK19aMiabl9xRG8xbb8%3D&ts=1316331271" 
     9月 18 16:34:31 symfony [info] {opWebResponse} Send header "Content-Type: text/html; charset=utf-8"                   
     9月 18 16:34:31 symfony [info] {opWebResponse} Send content (239 o)
    Sep 18 16:34:32 symfony [info] {sfPatternRouting} Connect sfRoute "image_nodefaults" (/image/*)
    Sep 18 16:34:32 symfony [info] {sfPatternRouting} Connect sfRoute "image" (/cache/img/:format/:width_:height/:filename.:noice)
    Sep 18 16:34:32 symfony [info] {sfPatternRouting} Match route "member_setSid" (/member/setSid) for /member/setSid with parameters array (  'module' => 'member',  'action' => 'setSid',)
     9月 18 16:34:32 symfony [info] {myUser} User is authenticated
     9月 18 16:34:32 symfony [info] {myUser} Add credential(s) "SNSMember" 
     9月 18 16:34:32 symfony [info] {sfFilterChain} Executing filter "sfRenderingFilter"                                   
     9月 18 16:34:32 symfony [info] {sfFilterChain} Executing filter "opCacheControlFilter" 
     9月 18 16:34:32 symfony [info] {sfFilterChain} Executing filter "opCheckEnabledApplicationFilter" 
     9月 18 16:34:32 symfony [info] {sfFilterChain} Executing filter "sfDenyFromNonMobileFilter" 
     9月 18 16:34:32 symfony [info] {sfFilterChain} Executing filter "sfMobileIOFilter" 
     9月 18 16:34:32 symfony [info] {sfFilterChain} Executing filter "opEmojiFilter" 
     9月 18 16:34:32 symfony [info] {sfFilterChain} Executing filter "opExecutionFilter" 
     9月 18 16:34:32 symfony [info] {memberActions} Call "memberActions->executeSetSid()" 
     9月 18 16:34:33 symfony [err] {opDeprecatedRoute} This routing rule is deprecated. Please use other rules instead of this.
     9月 18 16:34:33 symfony [err] {opDeprecatedRoute} This routing rule is deprecated. Please use other rules instead of this.
     9月 18 16:34:33 symfony [info] {opMobileFrontWebController} Redirect to "https://example.com/index.php/" 
     9月 18 16:34:33 symfony [info] {opWebResponse} Send status "HTTP/1.1 302 Found" 
     9月 18 16:34:33 symfony [info] {opWebResponse} Send header "Location: https://example.com/index.php/" 
     9月 18 16:34:33 symfony [info] {opWebResponse} Send header "Content-Type: text/html; charset=utf-8" 
     9月 18 16:34:33 symfony [info] {opWebResponse} Send content (104 o)
    

#8 Yuya Watanabe12年以上前に更新

note-7に続いて,下記状態においてssl利用時に認証情報が引き継がれているかどうかを確認しました.

config/OpenPNE.yml内記述について.

  • 使用した実機はau機
  • base_url, ssl_base_urlを設定
  • use_sslをtrueに設定
  • ssl_required_applicationsにはmobile_frontendを含まない
  • ssl_required_actionsから「member/login」を削除する
    mobile_frontend: ["member/register", "member/registerInput", "member/registerEnd", "member/editProfile", "member/config", "member/logout", "member/invite", "member/configUID"]
    

確認結果

この確認環境ではログインには成功しますが,他のSSLが必要である部分である「member/config」などのページを閲覧しようとすると「このページを見るにはログインが必要です」というメッセージとともにログイン画面へ遷移します.これによりSSLを用いるページとそうでないページで認証情報が共有できていないことが考えられます.

#9 Yuya Watanabe12年以上前に更新

確認内容

Cookieが得られるかどうか.

確認環境について

  • FMSのau機と実機のau機の2つ
  • base_url, ssl_base_urlを設定
  • use_sslをtrueに設定
  • ssl_required_applicationsにはmobile_frontendを含まない
  • ssl_required_actionsに「member/home」を追加する
    mobile_frontend: ["member/home", "member/register", "member/registerInput", "member/registerEnd", "member/editProfile", "member/config", "member/login", "member/logout", "member/invite", "member/configUID"]
    
  • setSidにリダイレクトを通さないようににする
    diff --git a/lib/user/opSecurityUser.class.php b/lib/user/opSecurityUser.class.php
    index 7d66a46..0549e67 100644
    --- a/lib/user/opSecurityUser.class.php
    +++ b/lib/user/opSecurityUser.class.php
    @@ -259,20 +259,21 @@ class opSecurityUser extends opAdaptableUser
           $uri = $this->getAuthAdapter()->getAuthForm()->getValue('next_uri');
    
           // sharing session id between HTTP and HTTPS is needed
    -      $request = sfContext::getInstance()->getRequest();
    -      if (sfConfig::get('app_is_mobile', false)
    -        && sfConfig::get('op_use_ssl', false)
    -        && $request->isSecure()
    -        && ($request->getMobile()->isSoftBank() || $request->getMobile()->isEZweb())
    -      )
    -      {
    -        $item = $this->encryptSid(session_id());
    -
    -        $uri = '@member_setSid?next_uri='.$uri
    -             .'&is_remember_login='.(int)$this->getAuthAdapter()->getAuthForm()->getValue('is_remember_me')
    -             .'&sid='.$item[0]
    -             .'&ts='.$item[1];
    -      }
    +      //$request = sfContext::getInstance()->getRequest();
    +      //if (sfConfig::get('app_is_mobile', false)
    +      //  && sfConfig::get('op_use_ssl', false)
    +      //  && $request->isSecure()
    +      //  && ($request->getMobile()->isSoftBank() || $request->getMobile()->isEZweb())
    +      //)
    +      //{
    +      //  $item = $this->encryptSid(session_id());
    +
    +      //  $uri = '@member_setSid?next_uri='.$uri
    +      //       .'&is_remember_login='.(int)$this->getAuthAdapter()->getAuthForm()->getValue('is_remember_me')
    +      //       .'&sid='.$item[0]
    +      //       .'&ts='.$item[1];
    +      //}
    
           $this->setCulture($this->getMember()->getConfig('language', sfConfig::get('sf_default_culture')));
    
    
  • ヘッダーの中身を出力する
    diff --git a/lib/vendor/symfony/lib/filter/sfBasicSecurityFilter.class.php b/lib/vendor/symfony/lib/filter/sfBasicSecurityFilter.class.php
    index 6917fb0..dee88f3 100644
    --- a/lib/vendor/symfony/lib/filter/sfBasicSecurityFilter.class.php
    +++ b/lib/vendor/symfony/lib/filter/sfBasicSecurityFilter.class.php
    @@ -29,6 +29,13 @@ class sfBasicSecurityFilter extends sfFilter
        */
       public function execute($filterChain)
       {
    +    if (
    +      ('member' == $this->context->getModuleName()) && ('home' == $this->context->getActionName())
    +    )
    +    {
    +      var_dump(getallheaders());
    +      exit(0);
    +    }
         // disable security on login and secure actions
         if (
           (sfConfig::get('sf_login_module') == $this->context->getModuleName()) && (sfConfig::get('sf_login_action') == $this->context->getActionName())
    

結果

FMSのau機は以下のような項目が存在するが実機のau機には存在しなかった.

'Cookie' => string 'OpenPNE_mobile_frontend=9t3jqmoflbj5m19ovubg56nim4' (length=145)

#10 Kousuke Ebihara12年以上前に更新

  • 担当者Yuya Watanabe から Kousuke Ebihara に変更

引き受けます

#11 Shingo Yamada12年以上前に更新

  • 360対象RC1 から 3.6.0 に変更

#12 Kousuke Ebihara12年以上前に更新

諸事情によって実機での一時的に確認ができなくなってしまったので、プロキシを用いて「HTTP と HTTPS 間で Cookie を共有しない」という状態を擬似的に作り出して再現を試みました。

このチケットを作成した時点の予測では、 setSid アクションに遷移する際に強制的に HTTP にリダイレクトしようとする場面でなんらかの問題があるものとあたりをつけていましたが、実際の挙動を確認すると、ログイン操作からホーム画面に遷移する間のすべてのリクエストは HTTPS に対しておこなわれています。ホーム画面が表示されるまでにアクセスした URL は以下の通りです。

https://example.com/index.php/member/login/authMode/MailAddress
https://example.com/index.php/member/setSid?next_uri=member%2Fhome&is_remember_login=0&sid=LwEBbzGuTIZhd6OFKdhdWtJ3wHbMaonRtGyzU64+YyA%3D&ts=1317215760
https://example.com/index.php/

これだけ見れば正常な挙動なように思います。OpenPNE の問題ではない可能性もでてきました。

#13 Mutsumi Imamura12年以上前に更新

  • 対象バージョン を削除 (OpenPNE 3.7.0)
  • 3.6 で発生するか を削除 (Yes)
  • 360対象 を削除 (3.6.0)

#note-12 の理由より、対応を見送ります。

#14 kaoru nほぼ9年前に更新

  • 3.6 で発生するかUnknown (未調査) にセット
  • 3.8 で発生するかUnknown (未調査) にセット

#15 kaoru nほぼ9年前に更新

  • 担当者 を削除 (Kousuke Ebihara)
  • 優先度High(高め) から Low(低め) に変更

#16 kaoru n約4年前に更新

  • 対象バージョンOpenPNE 3.10.x にセット

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