diff --git a/.github/workflows/e2e-test-throttling.yml b/.github/workflows/e2e-test-throttling.yml index bff054e4cda..6135c1a7f0b 100644 --- a/.github/workflows/e2e-test-throttling.yml +++ b/.github/workflows/e2e-test-throttling.yml @@ -21,7 +21,7 @@ jobs: matrix: php: [ 8.1 ] db: [ pgsql ] - method: [ フロント画面ログイン_IP, フロント画面ログイン_会員, 管理画面ログイン_IP, 管理画面ログイン_会員, 会員登録, 問い合わせ, パスワード再発行, 注文確認_非会員購入, 注文確認_会員購入, 注文完了_非会員購入, 注文完了_会員購入, 会員情報編集, 配送先情報_追加, 配送先情報_編集, 配送先情報_削除, order_お届け先追加, order_お届け先変更, 新規会員登録_入力 ] + method: [ フロント画面ログイン_IP, フロント画面ログイン_会員, 管理画面ログイン_IP, 管理画面ログイン_会員, 会員登録, 問い合わせ, パスワード再発行, 注文確認_非会員購入, 注文確認_会員購入, 注文完了_非会員購入, 注文完了_会員購入, 会員情報編集, 配送先情報_追加, 配送先情報_編集, 配送先情報_削除, order_お届け先追加, order_お届け先変更, 新規会員登録_入力, 管理画面二段階認証 ] include: - db: pgsql database_url: postgres://postgres:password@127.0.0.1:5432/eccube_db diff --git a/codeception/acceptance/EF09ThrottlingCest.php b/codeception/acceptance/EF09ThrottlingCest.php index 85bd15cc4f8..e9254d7bd80 100644 --- a/codeception/acceptance/EF09ThrottlingCest.php +++ b/codeception/acceptance/EF09ThrottlingCest.php @@ -772,4 +772,65 @@ public function 新規会員登録_入力(AcceptanceTester $I) $I->see('試行回数の上限を超過しました。しばらくお待ちいただき、再度お試しください。', 'p.ec-reportDescription'); } + public function 管理画面二段階認証(AcceptanceTester $I) + { + $I->loginAsAdmin(); + + // 二段階認証を有効にしてメンバーを新規作成 + $config = Fixtures::get('config'); + $I->amOnPage('/'.$config['eccube_admin_route'].'/setting/system/member/new'); + $I->see('メンバー登録システム設定', '.c-pageTitle'); + + $login_id = 'admin_'.\Eccube\Util\StringUtil::random(6); + $password = 'password1234'; + $I->fillField(['id' => 'admin_member_name'], '管理者'); + $I->fillField(['id' => 'admin_member_department'], 'admin_throttling'); + $I->fillField(['id' => 'admin_member_login_id'], $login_id); + $I->fillField(['id' => 'admin_member_plain_password_first'], $password); + $I->fillField(['id' => 'admin_member_plain_password_second'], $password); + $I->selectOption(['id' => 'admin_member_Authority'], 'システム管理者'); + $I->click("label[for='admin_member_Work_1']"); // 稼働 + $I->click("label[for='admin_member_two_factor_auth_enabled']"); // 有効 + $I->click('#member_form .c-conversionArea__container button'); + $I->see('保存しました', '.c-contentsArea .alert-success'); + + $I->logoutAsAdmin(); + + // 作成したメンバーでログイン + $I->submitForm('#form1', [ + 'login_id' => $login_id, + 'password' => $password, + ]); + + // 二段階認証のセットアップ + $secret = $I->executeJS('return $("#admin_two_factor_auth_auth_key").val();'); + $tfa = new \RobThree\Auth\TwoFactorAuth(); + $code = $tfa->getCode($secret); + $I->fillField(['id' => 'admin_two_factor_auth_device_token'], $code); + $I->click('登録'); + $I->see('ホーム', '.c-contentsArea .c-pageTitle > .c-pageTitle__titles'); + + // ログアウトし、二段階認証を試行する + $I->logoutAsAdmin(); + + $I->resetCookie('eccube_2fa'); // 2要素認証のクッキーを削除 + + $I->submitForm('#form1', [ + 'login_id' => $login_id, + 'password' => $password, + ]); + + // トークン入力画面で5回入力 + for ($i = 0; $i < 5; $i++) { + $I->fillField(['id' => 'admin_two_factor_auth_device_token'], 'aaaaa'.$i); + $I->click('認証'); + $I->waitForText('トークンに誤りがあります。再度入力してください。'); + } + + // トークン入力の試行回数制限を超過 + $I->fillField(['id' => 'admin_two_factor_auth_device_token'], 'aaaaaa'); + $I->click('認証'); + + $I->see('試行回数の上限を超過しました。しばらくお待ちいただき、再度お試しください。', 'p'); + } }