model = new User(); } /** * @throws RandomException */ #[NoReturn] public function actionAuth(): void { $request = new Request(); $data = $request->post(); $model = $this->model->where('username', $data['username'])->first(); $res = []; if ($model) { if (password_verify($data["password"], $model->password_hash)) { $model->access_token_expires_at = date("Y-m-d H:i:s", strtotime(App::$secure['token_expired_time'])); $model->access_token = match (App::$secure['token_type']) { "JWT" => TokenService::JWT($_ENV['SECRET_KEY'], 'HS256'), "md5" => TokenService::md5(), "crypt" => TokenService::crypt(), "hash" => TokenService::hash('sha256'), default => TokenService::random_bytes(20), }; $res = [ "access_token" => $model->access_token, "access_token_expires_at" => $model->access_token_expires_at, ]; } $model->save(); } $this->renderApi($res); } /** * @throws Exception * @throws RandomException */ #[NoReturn] public function actionEmailAuth(): void { $mailing = new Mailing(); $request = new Request(); $data = $request->post(); $model = $this->model->where('email', $data['email'])->first(); if (!$model) { $password = bin2hex(random_bytes(8)); UserService::createUserByEmailAndPassword($data['email'], $password); $model = UserService::getByField('email', $data['email']); SecureService::createSecretCode($model); $secretCode = SecureService::getByField("user_id", $model->id); $mailing->send_html("register_by_code.php", ['code' => $secretCode->code, 'password' => $password], [ 'address' => $data['email'], 'subject' => "Код регистрации", "from_name" => $_ENV['APP_NAME'] ]); } else { SecureService::updateSecretCode($model); $secretCode = SecureService::getByField("user_id", $model->id); $mailing->send_html("login_by_code.php", ['code' => $secretCode->code], [ 'address' => $data['email'], 'subject' => "Код авторизации", "from_name" => $_ENV['APP_NAME'] ]); } $res = [ "code" => $secretCode->code, "code_expires_at" => $secretCode->code_expires_at, ]; setcookie('user_email', $data['email'], time()+60*15, '/', $_SERVER['SERVER_NAME'], false); $this->renderApi($res); } /** * @throws Exception */ public function actionCodeCheck(): void { $request = new Request(); if (isset($_COOKIE['user_email'])) { $user = User::where('email', $_COOKIE["user_email"])->first(); if (!$user) { throw new exception("User not found."); } $code = $request->post("code"); $secretCode = SecureService::getByField("user_id", $user->id); if ($secretCode->code == $code && time() <= strtotime($secretCode->code_expires_at)) { setcookie('user_id', $user->id, time() + 60 * 60 * 24, '/', $_SERVER['SERVER_NAME'], false); } else { throw new exception("incorrect code"); } } } }