Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过otp登录Yii2不会生成cookie_Php_Ajax_Yii2_Yii2 Advanced App_One Time Password - Fatal编程技术网

Php 通过otp登录Yii2不会生成cookie

Php 通过otp登录Yii2不会生成cookie,php,ajax,yii2,yii2-advanced-app,one-time-password,Php,Ajax,Yii2,Yii2 Advanced App,One Time Password,我使用Yii2高级应用程序(2.0.15),需要使用OTP进行登录操作。 有了手机号码和密码,一切都是正确的,cookie也是正确的,但是当我使用opt时,cookie没有创建任何值 我的ajax代码: $("#m-sendCode__form-submit").click(function() { $(this).attr('disabled','true'); let mobile = $('#mobile').val(); let csrfToken = $('me

我使用Yii2高级应用程序(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的值


请告诉我错误。

控制器应按如下方式更换:

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所说,我们不应该使用退出


在Yii:@app->response->format=response::format_JSON的帮助下,一切正常

不要使用
exit
-它将破坏框架流,并且可能无法正确执行某些操作(例如发送头,包括cookie)。您应该返回响应,最好使用@rob006谢谢,您是对的,这正是我在这一部分中的错误。