Php 通过otp登录Yii2不会生成cookie
我使用Yii2高级应用程序(2.0.15),需要使用OTP进行登录操作。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
有了手机号码和密码,一切都是正确的,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谢谢,您是对的,这正是我在这一部分中的错误。