Правильная ajax авторизация на yii2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
SirotinD
Сообщения: 3
Зарегистрирован: 2019.03.29, 12:27

Правильная ajax авторизация на yii2

Сообщение SirotinD »

Есть модульное окно - там форма авторизации
в форме стоит reCaptcha - https://github.com/himiklab/yii2-recaptcha-widget
Как сделать верную аякс авторизацию?

пытаюсь так через виджет:


Код: Выделить всё

namespace frontend\widgets;
 
use Yii;
use yii\base\Widget;
use common\models\LoginForm;
 
class LoginFormWidget extends Widget {
 
    public function run() {
        if (Yii::$app->user->isGuest) {
            $model = new LoginForm();
            return $this->render('loginFormWidget', [
                'model' => $model,
            ]);
        } else {
            return ;
        }
    }
 
}

представление виджета:

Код: Выделить всё

<?php
use yii\bootstrap\ActiveForm;
use yii\helpers\Html;
?>
<?php $form = ActiveForm::begin([
	'id' => 'login-form',
	'class'=>'popup_form',
    'enableAjaxValidation' => true,
    'action' => ['site/ajax-login'],
]); ?>
	
	<div class="popup__form-row popup__form-row--email">
		<span class="popup__form-label">логин</span>
		<?= $form->field($model, 'username')->textInput(['autofocus' => true,'class'=>'form-input','placeholder'=>'Введите e-mail'])->label(false) ?>
	</div>
	
	<div class="popup__form-row">
		<span class="popup__form-label">Пароль</span>
		<label class="input-pass">
			<?= $form->field($model, 'password')->passwordInput(['class'=>"input-pass",'placeholder'=>"Введите пароль"])->label(false) ?>
		</label>
	</div>
	
	<div class="popup__form-row popup__form-row--captcha">
		<?= $form->field($model, 'reCaptcha',['enableAjaxValidation'=>false])->widget(\himiklab\yii2\recaptcha\ReCaptcha::className())->label(false) ?>
	</div>
	
	<div class="popup__form-bottom">
		<?= Html::submitButton('Войти', ['class' => 'popup__form-submit', 'name' => 'login-button']) ?>
	</div>
<?php ActiveForm::end(); ?>

сам экшн

Код: Выделить всё

	
	public function actionAjaxLogin() {
	
        $model = new LoginForm;
        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
			if($model->login()) {
					return $this->redirect('/site/index');
			} else { 
				Yii::$app->response->format = yii\web\Response::FORMAT_JSON;
				return \yii\widgets\ActiveForm::validate($model);
			}
			//return $this->renderAjax('@frontend/widgets/views/loginFormWidget', ['model' => $model]); 
		}	
	}
почемуто при верном вводе редирект не происходит хотя по идее должен
если неверно ввести а потом верно то почеуто кидает на страницу /ajax-login
и можно без доп js кода прятать кнопку - показывать на ее месте прелоадер

очень прошу помочь
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Правильная ajax авторизация на yii2

Сообщение leonenco »

SirotinD писал(а): 2019.03.29, 16:24 Есть модульное окно - там форма авторизации
в форме стоит reCaptcha - https://github.com/himiklab/yii2-recaptcha-widget
Как сделать верную аякс авторизацию?

пытаюсь так через виджет:


Код: Выделить всё

namespace frontend\widgets;
 
use Yii;
use yii\base\Widget;
use common\models\LoginForm;
 
class LoginFormWidget extends Widget {
 
    public function run() {
        if (Yii::$app->user->isGuest) {
            $model = new LoginForm();
            return $this->render('loginFormWidget', [
                'model' => $model,
            ]);
        } else {
            return ;
        }
    }
 
}

представление виджета:

Код: Выделить всё

<?php
use yii\bootstrap\ActiveForm;
use yii\helpers\Html;
?>
<?php $form = ActiveForm::begin([
	'id' => 'login-form',
	'class'=>'popup_form',
    'enableAjaxValidation' => true,
    'action' => ['site/ajax-login'],
]); ?>
	
	<div class="popup__form-row popup__form-row--email">
		<span class="popup__form-label">логин</span>
		<?= $form->field($model, 'username')->textInput(['autofocus' => true,'class'=>'form-input','placeholder'=>'Введите e-mail'])->label(false) ?>
	</div>
	
	<div class="popup__form-row">
		<span class="popup__form-label">Пароль</span>
		<label class="input-pass">
			<?= $form->field($model, 'password')->passwordInput(['class'=>"input-pass",'placeholder'=>"Введите пароль"])->label(false) ?>
		</label>
	</div>
	
	<div class="popup__form-row popup__form-row--captcha">
		<?= $form->field($model, 'reCaptcha',['enableAjaxValidation'=>false])->widget(\himiklab\yii2\recaptcha\ReCaptcha::className())->label(false) ?>
	</div>
	
	<div class="popup__form-bottom">
		<?= Html::submitButton('Войти', ['class' => 'popup__form-submit', 'name' => 'login-button']) ?>
	</div>
<?php ActiveForm::end(); ?>

сам экшн

Код: Выделить всё

	
	public function actionAjaxLogin() {
	
        $model = new LoginForm;
        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
			if($model->login()) {
					return $this->redirect('/site/index');
			} else { 
				Yii::$app->response->format = yii\web\Response::FORMAT_JSON;
				return \yii\widgets\ActiveForm::validate($model);
			}
			//return $this->renderAjax('@frontend/widgets/views/loginFormWidget', ['model' => $model]); 
		}	
	}
почемуто при верном вводе редирект не происходит хотя по идее должен
если неверно ввести а потом верно то почеуто кидает на страницу /ajax-login
и можно без доп js кода прятать кнопку - показывать на ее месте прелоадер

очень прошу помочь
попробуй изменить на

Код: Выделить всё

      return $this->redirect(\yii\helpers\Url::to('site/index'));
[\code]
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Правильная ajax авторизация на yii2

Сообщение proctoleha »

У вас идет путаница, давайте разбираться.

1. Ajax это фронтенд - работает браузер.
2. Контроллер, модели - это бэкенд, работает сервер.

И вот ситуация: мы через ajax говорим серверу - сделай нам такие-то действия, неважно какие. Важен сам принцип: мы говорим - сервер сделай нам что-то, вот тебе данные, чтобы ты это сделал.
И если все написано правильно, сервер нам это делает и возвращает/не-возвращает ответ. Именно в этом у вас путаница: сервер возвращает/не-возвращает ответ. А вы хотите чтобы был редирект. Редирект - это не ответ, это действие!!!

Т.е. если вы используете ajax, вы посылаете запрос, и принимаете ответ. И на основании ответа сервера, вы во фронтенде, должны принять решение: то ли сделать редирект, используя js, то ли вывести ошибки. Т.е. речь идет все-таки о js. Yii2 тут постольку поскольку.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Ответить