customerRepository = $customerRepository; $this->customerPasskeysAuthService = $customerPasskeysAuthService; $this->twig = $twig; } /** * Passkey authentication page. * * @Route("/passkeys", name="plg_customer_passkey_page", methods={"GET", "POST"}) * @Template("Passkeys/Resource/template/default/passkey.twig") */ public function passkeyAuth(Request $request) { //log_info('Passkey authentication page1.'); if ($this->isPasskeysAuthed()) { return $this->redirectToRoute($this->getCallbackRoute()); } //log_info('Passkey authentication page2.'); /** @var Customer $Customer */ $Customer = $this->getUser(); $error = null; if ('POST' === $request->getMethod()) { $mode = $request->get('mode'); switch ($mode) { case 'login_succ': $rp = $request->get('rp'); $session = $request->get('pk_session'); log_info('Passkey authentication Post2.'.$rp."|".$session); if($session != null){ //Check session is valid $session_valid = $this->customerPasskeysAuthService->checkSession($session, $rp); if($session_valid){ log_info('Passkey authentication Post3. sesson valid:'.$session); $response = $this->redirectToRoute($this->getCallbackRoute()); $response->headers->setCookie( $this->customerPasskeysAuthService->createAuthedCookie( $Customer, $this->getCallbackRoute() )); return $response; } } break; case 'no_webauthn'://TODO: Add config(force logout or pass as current process) on shop config page for this case log_info('Browser without webauthn support, pass to success page.'); $response = $this->redirectToRoute($this->getCallbackRoute()); $response->headers->setCookie( $this->customerPasskeysAuthService->createAuthedCookie( $Customer, $this->getCallbackRoute() )); return $response; break; default: log_info('Unknown mode:'.$mode); break; } } log_info('Passkey authentication page3:'.$this->getCallbackRoute()); return [ //'form' => $form->createView(), 'Customer' => $Customer, 'error' => $error, 'succ_route' => $this->getCallbackRoute(), ]; } /** * 認証済みか否か. * * @return boolean */ protected function isPasskeysAuthed(): bool { /** @var Customer $Customer */ $Customer = $this->getUser(); if ($Customer != null && !$this->customerPasskeysAuthService->isAuthed($Customer, $this->getCallbackRoute())) { return false; } return true; } /** * コールバックルートの取得. * * @return string */ protected function getCallbackRoute(): string { $route = $this->session->get(CustomerPasskeysAuthService::SESSION_CALL_BACK_URL); log_info('Passkey getCallbackRoute:'.$route); return ($route != null) ? $route : 'mypage'; } }