Логин Yii2 по otp не делает куки

Я использую Yii2-advanced-app(2.0.15), и мне нужно выполнить операцию входа в систему с помощью OTP.
С номером ячейки и паролем все правильно, и файл cookie правильный, но когда я использую opt, нет значения создается для файла cookie.

Мой код ajax:

$("#m-sendCode__form-submit").click(function() {
    $(this).attr('disabled','true');
    let mobile = $('#mobile').val();
    let csrfToken = $('meta[name="csrf-token"]').attr("content");
    let rememberMe = $("#remember2").prop('checked');
    // console.log(rememberMe);
    $.ajax({
        url: '/loginbysms',
        method: 'POST',
        data: {
            _csrfFrontend: csrfToken,
            phone: phone,
            rememberMe: rememberMe
        },
        timeout: 6000
    })
    .done(function(data) {
            let response = JSON.parse(data);
            // console.log(data);
            if (response.sent === 1){
                 $.ajax({
                        url: '/loginbysms',
                        method: 'POST',
                        data: {
                            _csrfFrontend: csrfToken,
                            verify: verify,
                            // rememberMe: rememberMe
                        },
                    })
                   .done(function(data) {
                        let s = JSON.parse(data);
                        if (s.status === 1){
                            window.location.href = '/';
                        } 
                    });
            }
     })
     .fail(function(error)){
            console.log(error);
     });
});  

И мой контроллер:

public function actionLoginbysms()
{
    $dataAjax = Yii::$app->request->post();
    $session = Yii::$app->session;


    if(isset($dataAjax)) {
        if (isset($dataAjax['phone']) && !empty($dataAjax['phone'])) {
              $phone = $dataAjax['phone'];
              $user = User::findByPhone2($phone);
              $sendSMS = new SendSMS();
              if ($sendSMS->SendSMS($user->user_otp, $phone)) {
                   echo json_encode(['sent' => 1]);
                   exit;
              } else {
                   echo json_encode(['sent' => 0]);
                   exit;
              }
        }
        if(isset($dataAjax['verify]) && !empty($dataAjax['verfy'])){
              $authorizedUser = User::findByOtp($session- 
                 >get('user_phone'), $dataAjax['verify']);
              if (isset($authorizedUser) && !empty($authorizedUser)) {
                     Yii::$app->user->login($authorizedUser, 3600 * 24 * 
                     30)
                     echo json_encode(['status' => 1]);
                     exit;
              }
        }
    }

}  

Когда все верно и код отправлен пользователем правильно, пользователь правильно входит на домашнюю страницу, но значение для файла cookie не сохраняется.

Пожалуйста, скажите мне ошибку.


person MHF    schedule 12.09.2018    source источник
comment
Не используйте exit — это нарушит работу фреймворка и некоторые операции могут выполняться некорректно (например, отправка заголовков, включая файлы cookie). Вы должны вернуть ответ, предпочтительно используя asJson().   -  person rob006    schedule 13.09.2018
comment
@ rob006 спасибо, вы правы, это была именно моя ошибка в этой части.   -  person MHF    schedule 13.09.2018


Ответы (1)


Контроллер следует менять следующим образом:

public function actionLoginbysms()
{

    $dataAjax = Yii::$app->request->post();
    $session = Yii::$app->session;

    if(Yii::$app->request->isAjax) {
        Yii::$app->response->format = Response::FORMAT_JSON;

        if (isset($dataAjax['phone']) && !empty($dataAjax['phone'])) {

            $mobile = $dataAjax['phone'];
            $user = User::findByPhone2($phone);

            if ($user) {
                unset($dataAjax['phone']);
                $numbers = range(10000, 99999);
                shuffle($numbers);
                $session->set('user_phone', $phone);

                if (isset($dataAjax['rememberMe']) && !empty($dataAjax['rememberMe'])
                    && ($dataAjax['rememberMe'] == true)) {
                    $session->set('rememberMe', 'yes');
                    unset($dataAjax['rememberMe']);
                }

                $user->user_otp = $numbers[0];
                $user->save();

                try {
                    $sendSMS = new SendSMS();
                    $sendSMS->SendSMS($user->user_otp, $phone);
                } catch (\Throwable $e) {
                    return [
                        'sent' => 0
                    ];
                }

                return [
                    'sent' => 1
                ];

            } else {
                return ['user_not_found' => 1];
            }
        }
        else if (isset($dataAjax['verify']) && !empty($dataAjax['verify'])) {
            if ($session->isActive && $session->has('user_phone')) {
                $authorizedUser = User::findByOtp($session->get('user_phone'), $dataAjax['verify']);

                if (isset($authorizedUser) && !empty($authorizedUser)) {
                    unset($dataAjax['verify']);
                    $session->remove('user_phone');
                    $authorizedUser->user_otp = '';
                    $authorizedUser->save();

                    if(Yii::$app->user->login($authorizedUser, 3600 * 24 * 30)) {
                        return ['authenticationSuccess' => 1];
                    }
                }
            }

            return ['authenticationSuccess' => 0];
        }
    }
}

Как сказал @rob006, мы не должны использовать exit.

С помощью Yii::@app->response->format = Response::FORMAT_JSON все работает нормально

person MHF    schedule 13.09.2018