Yii2 логин по otp не делает куки - PullRequest
       27

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

0 голосов
/ 12 сентября 2018

Я использую 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 не сохраняется.

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

1 Ответ

0 голосов
/ 13 сентября 2018

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

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 все отлично работает

...