diff --git a/public/index.php b/public/index.php index 1a926eb..ddca47a 100644 --- a/public/index.php +++ b/public/index.php @@ -29,7 +29,7 @@ if ($match !== null) { } if (!$authorized) { - Container::$request->session()->set('redirect_after_login', $url); + Container::$request->session()->set('redirect_after_login', '/' . $url); $response = new Redirect(Container::$routeCollection->getRoute('login')->generateLink(), IRedirect::TEMPORARY); header('Location: ' . $response->getUrl(), true, $response->getHttpCode()); return; diff --git a/src/Controller/LoginController.php b/src/Controller/LoginController.php index 13c90c4..8588ebf 100644 --- a/src/Controller/LoginController.php +++ b/src/Controller/LoginController.php @@ -41,7 +41,7 @@ class LoginController return new Redirect(\Container::$routeCollection->getRoute('index')->generateLink(), IRedirect::TEMPORARY); } - return new HtmlContent('login/login'); + return new HtmlContent('login/login', ['redirectUrl' => $this->getRedirectUrl()]); } public function getGoogleLoginRedirect(): IRedirect @@ -91,12 +91,13 @@ class LoginController $user = $this->userRepository->getById($resetter->getUserId()); - return new HtmlContent('login/reset_password', ['success' => true, 'token' => $token, 'email' => $user->getEmail()]); + return new HtmlContent('login/reset_password', ['success' => true, 'token' => $token, 'email' => $user->getEmail(), 'redirectUrl' => $this->getRedirectUrl()]); } public function login(): IContent { if ($this->request->user() !== null) { + $this->deleteRedirectUrl(); return new JsonContent(['success' => true]); } @@ -112,23 +113,21 @@ class LoginController $this->request->setUser($user); + $this->deleteRedirectUrl(); return new JsonContent(['success' => true]); } public function loginWithGoogle() { - $redirectUrl = $this->request->session()->get('redirect_after_login'); - if ($redirectUrl === null) { - $redirectUrl = \Container::$routeCollection->getRoute('index')->generateLink(); - } + $defaultError = 'Authentication with Google failed. Please try again!'; if ($this->request->user() !== null) { - $this->request->session()->delete('redirect_after_login'); - return new Redirect($redirectUrl, IRedirect::TEMPORARY); + $this->deleteRedirectUrl(); + return new Redirect($this->getRedirectUrl(), IRedirect::TEMPORARY); } if ($this->request->query('state') !== $this->request->session()->get('oauth_state')) { - return new HtmlContent('login/google_login'); + return new HtmlContent('login/google_login_error', ['error' => $defaultError]); } $oAuth = new GoogleOAuth(new Request()); @@ -138,33 +137,29 @@ class LoginController ); if (!isset($tokenData['id_token'])) { - return new HtmlContent('login/google_login'); + return new HtmlContent('login/google_login_error', ['error' => $defaultError]); } $jwtParser = new JwtParser($tokenData['id_token']); $idToken = $jwtParser->getPayload(); if ($idToken['nonce'] !== $this->request->session()->get('oauth_nonce')) { - return new HtmlContent('login/google_login'); + return new HtmlContent('login/google_login_error', ['error' => $defaultError]); } if (!$idToken['email_verified']) { - return new HtmlContent('login/google_login'); + return new HtmlContent('login/google_login_error', ['error' => $defaultError]); } $user = $this->userRepository->getByGoogleSub($idToken['sub']); if ($user === null) { - return new JsonContent([ - 'error' => [ - 'errorText' => 'No user found for this Google account.' - ] - ]); + return new HtmlContent('login/google_login_error', ['error' => 'No user found for this Google account.']); } $this->request->setUser($user); - $this->request->session()->delete('redirect_after_login'); - return new Redirect($redirectUrl, IRedirect::TEMPORARY); + $this->deleteRedirectUrl(); + return new Redirect($this->getRedirectUrl(), IRedirect::TEMPORARY); } public function logout(): IRedirect @@ -177,9 +172,10 @@ class LoginController public function requestPasswordReset(): IContent { if ($this->request->user() !== null) { + $this->deleteRedirectUrl(); return new JsonContent([ 'redirect' => [ - 'target' => '/' . \Container::$routeCollection->getRoute('home')->generateLink() + 'target' => $this->getRedirectUrl() ] ]); } @@ -240,9 +236,10 @@ class LoginController public function resetPassword(): IContent { if ($this->request->user() !== null) { + $this->deleteRedirectUrl(); return new JsonContent([ 'redirect' => [ - 'target' => '/' . \Container::$routeCollection->getRoute('home')->generateLink() + 'target' => $this->getRedirectUrl() ] ]); } @@ -283,6 +280,7 @@ class LoginController $this->request->setUser($user); + $this->deleteRedirectUrl(); return new JsonContent(['success' => true]); } @@ -299,4 +297,18 @@ class LoginController ]); $mail->send(); } + + private function getRedirectUrl(): string + { + $redirectUrl = $this->request->session()->get('redirect_after_login'); + if ($redirectUrl === null) { + return \Container::$routeCollection->getRoute('index')->generateLink(); + } + return $redirectUrl; + } + + private function deleteRedirectUrl(): void + { + $this->request->session()->delete('redirect_after_login'); + } } diff --git a/views/login/google_login.php b/views/login/google_login.php deleted file mode 100644 index c438c42..0000000 --- a/views/login/google_login.php +++ /dev/null @@ -1,8 +0,0 @@ -@extends(templates/layout_normal) - -@section(main) -
Authentication with Google failed. Please try again!
-= $error ?>
+