Laravel по-русски

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

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

#1 Laravel 5.x » Пожалуйста, помогите разобраться, почему не всегда сохраняются сессии » 26.06.2018 16:24:42

MrBlackwell
Ответов: 1

Версия 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', 'Возникла ошибка, попробуйте ещё раз');
        }
    }

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