Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 26.06.2018 16:24:42

Пожалуйста, помогите разобраться, почему не всегда сохраняются сессии

Версия Laravel: 5.5
Версия PHP: 7.1

В моем приложении есть метод register, который устанавливает две переменные в сессии и затем посылает редирект
на страницу подвезждение, на которой вводится код, и после этого идет обработка этого кода методом confirm с чтением данных из сессии

При выполении метода confirm вылетает ошибка Illuminate \ Contracts \ Encryption \ DecryptException
The payload is invalid.
В идеале метод должен прочитать переменные из сессии и проанализировать введенный код
при созпадении в сессию ставится ещё одна переменная, если нет то код для ввода отправляется снова пользователю

После гугления удалось понять, что вылетающаю ошибку выдает метод Crypt::decryptString, а выдает он её
потому что из сессии ничего не считывается. При этом на локальном сервере OpenServer, всё работает. При
размещении проекта на хостинге вылетает ошибка.
Для хранения сессий используется файл, настроенный по умолчанию

Код метода register:

public function register(Request $request){
        $phone = str_replace(['+', '(', ')', '-', ' '], [], $request->phone);
        if($request->user_type == 1){
            $user = Master::select("id")->where("phone", "=", $phone)->
            orWhere("email", "=", mb_strtolower($request->email, 'UTF-8'), "or")->first();
        } else {
            $user = Client::select("id")->where("phone", "=", $phone)->
            orWhere("email", "=", mb_strtolower($request->email, 'UTF-8'), "or")->first();
        }
        if($user == null) {
            $sender = new Sms();
            $code = $this->code_generation();
            $validator = Validator::make($request->all(),
                [
                    'user_type' => 'required',
                    'phone' => 'required|min:17|max:17',
                    'email' => 'required|email',
                    'first_name' => 'required|alpha',
                    'last_name' => 'required|alpha'
                ],
                [
                    'user_type.required' => 'Выберите тип пользователя',
                    'phone.required' => 'Введите телефон',
                    'phone.min' => 'Введите корректный номер телефона',
                    'phone.max' => 'Введите корректный номер телефона',
                    'email.required' => 'Введите e-mail',
                    'email.email' => 'Введите корректный e-mail',
                    'first_name.required' => 'Введите фамилию',
                    'first_name.alpha' => 'Введите корректную фамилию',
                    'last_name.required' => 'Введите имя',
                    'last_name.alpha' => 'Введите корректное имя'
                ]
            );
            $validator->validate();
            $phone = str_replace(['+', '(', ')', '-', ' '], [], $request->phone);
            $sc_id = SafeCrow::getUserIdByPhone($phone);
            if($sc_id == null){
                $user = json_decode(SafeCrow::createUser($phone, $request->email, $request->first_name, $request->last_name));
                //print_r($user);
                $sc_id = $user->id;
                //print_r($user);
            }

            if ($request->user_type == 1) {
                $id = Master::insertGetId([
                    "sc_id" => $sc_id,
                    "phone" => $phone,
                    "email" => mb_strtolower($request->email, 'UTF-8'),
                    "first_name" => $request->first_name,
                    "last_name" => $request->last_name,
                    "confirm_code" => $code,
                    "created_at" => date("Y-m-d H:i:s"),
                    "updated_at" => date("Y-m-d H:i:s")
                ]);
            } else {
                $id = Client::insertGetId([
                    "sc_id" => $sc_id,
                    "phone" => $phone,
                    "email" => mb_strtolower($request->email, 'UTF-8'),
                    "first_name" => $request->first_name,
                    "last_name" => $request->last_name,
                    "confirm_code" => $code,
                    "created_at" => date("Y-m-d H:i:s"),
                    "updated_at" => date("Y-m-d H:i:s")
                ]);
            }
            $sender->send($phone, "You code for Aladdin auth is: " . $code, "Aladdin");
            session(['id' => Crypt::encryptString($id)]);
            session(['user_type' => Crypt::encryptString($request->user_type)]);
            Session::save();
            return redirect('/confirm');
        } else {
            return redirect('/registration')->with('unsuccess', "Данный пользователь уже зарегистрирован");
        }

Код метода confirm:

public function confirm(Request $request){
        $sender = new Sms();
        $validator = Validator::make($request->all(),
            [
                'code' => 'required|digits:6',
            ],
            [
                'code.digits' => 'Некоректный код'
            ]);
        $validator->validate();
        if(Crypt::decryptString(session('user_type')) == 0){
            $user = Client::find(Crypt::decryptString(session('id')));
        } else { //Мастер
            $user = Master::find(Crypt::decryptString(session('id')));
        }
        if($user != null){
            if($user->confirm_code == $request->code){
                $user->update(['confirm_code' => null]);
                session(['auth' => Crypt::encryptString('1')]);
                if(($user instanceof Client) and session()->get('login_data') /*and session()->get('login_target')*/){
                    /*$target = session()->get('login_target');
                    switch ($target) {
                        case 'search/mini_order':*/
                            return redirect()->action('SearchController@saveOrder');
                    //}
                }
                return redirect('/orders');
            } else {
                $code = $this->code_generation();
                $user->update(['confirm_code' => $code]);
                $sender->send($request->phone, "You code for Aladdin auth is: " . $code, "Aladdin");
                return redirect('/confirm')->with('unsuccess', 'Неверный код');
            }
        } else {
            return redirect('/login')->with('unsuccess', 'Возникла ошибка, попробуйте ещё раз');
        }
    }

Не в сети

#2 28.06.2018 15:16:47

Re: Пожалуйста, помогите разобраться, почему не всегда сохраняются сессии

Буквально ответить почему что-то отсутствует я не могу. Есть общие замечание по коду.

В общем случае не надо твердо расчитывать что какое-то значение точно присутствует в сессии. Нельзя просто взять и безусловно использовать это (возмождно пустое) значение где-то ещё. Проверь сначала не пустое ли. Используй значения по умолчанию.

Как-то всё здесь слишком сложно. Зачем самому кодировать значения в сессии? Зачем самому вызывать save() ? Это всё за кадром само происходит.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

Подвал раздела