Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Помогите пожалуйста разобраться, создал middleware sms_authenticate
Все работает код на телефон приходит сохраняется в базе, но на завершающем этапе когда надо аутентифицировать пользователя в системе методом $this->auth->authenticate();
Что то не срабатывает выкидывает на страницу обычного логина
Хотя у меня своя страница СМС логина была создана
По идее должен аутентифицировать пользователя там занести его в сессиб методами Ларавеля и выйти из middleware на
next request
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Contracts\Auth\Factory as Auth;
use Illuminate\Support\Facades\View as View;
use App\Http\Libraries\sms;
use App\User_login;
use App\Meta;
class SmsAuthenticate
{
/**
* The authentication factory instance.
*
* @var \Illuminate\Contracts\Auth\Factory
*/
protected $auth;
/**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Auth\Factory $auth
* @return void
*/
public function __construct(Auth $auth)
{
$this->auth = $auth;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string[] ...$guards
* @return mixed
*
* @throws \Illuminate\Auth\AuthenticationException
*/
public function handle($request, Closure $next, ...$guards)
{
if (!$this->auth->user()) {
if (isset($_POST['sms_verification']) && $_POST['sms_verification'] == 'true') {
$phone = preg_replace('~\D+~', '', $_POST['phone']);
$sms_verification = $this->login($phone, $_POST['login_sms_verification']);
if (isset($sms_verification['error'])) {
$sms_verification['phone'] = $phone;
return redirect()->route('view_sms_verification', $sms_verification);
}
} else {
if (isset($_POST['phone'])) {
$phone = preg_replace('~\D+~', '', $_POST['phone']);
}
if (isset($_POST['sended']) && $_POST['sended'] == 'true') {
$response = $this->send_sms($phone);
if (isset($response['error'])) {
$data_content['error'] = $response['error'];
} else {
$data_content['phone'] = $phone;
return redirect()->route('view_sms_verification', $data_content);
}
} else {
return redirect()->route('sms_login');
}
}
}
$this->auth->authenticate();
return $next($request);
}
function send_sms($phone, $data_content = null)
{
$phone = htmlspecialchars($phone);
$sms = new SMS();
$result = User_login::check_status($phone);
if (!$result) {
// Создаем пользователя если нет такого телефона
User_login::create_user($phone);
} else {
if ($result->status == 0) {
$response['error'] = trans('login.lg_acc_is_blocked');
return $response;
}
}
$code = User_login::generateCode(2);
User_login::save_verification_code($phone, $code);
$sms_text = Meta::create('sms_to_client_on_login', array('code' => $code));
/*$response = $sms->send(array('phone'=>$phone,'text'=>$sms_text));*/
if (isset($response['error'])) {
return array('error' => trans('login.lg_send_sms_error'));
} else {
return TRUE;
}
}
function login($phone, $code)
{
$phone = str_replace(' ', '', $phone);
$saved_code = User_login::return_verification_code($phone);
if ($saved_code == $code && $code != '') {
// удаляем код с базы
User_login::delete_verification_code($phone);
return true;
} else {
return array('error' => trans('login.lg_wrong_code'));
}
}
}
Есть мысль что на момент аутентификации в базе нет email && name Может он без этих полей не аутентифицирует, как тогда быть подскажите. По возможности дайте максимально полный ответ.Примного благодарен
Изменено imediasun (28.09.2017 14:01:21)
Не в сети
я думаю, твоя принципиальная ошибка – в том что ты это делаешь внутри миддлвари. этот код на 100% должен находиться в контроллере и иметь свой собственный экшен, и не один. вторая ошибка – то что разные действия совершаются в одном методе – отправка кода и его проверка – это разные экшены, в-третьих с параметрами запроса надо работать через объект Request, а не лазить в $_POST, чай не на PHP4 пишешь…
на этапе выполнения миддлвари нет гарантии что состояние авторизации уже считано из сессии и что сессия вообще проинициализирована – за это также отвечают миддлвари и порядок их выполнения в данном конкретном случае имеет значение. на этапе выполнения экшена в контроллере инициализация заведомо завершена полностью – там и должен находиться твой код, в необходимости выносить его в миддлварь нет никаких оснований…
Не в сети
Все понятно - спасибо за совет но вот авторизация все равно не произойдет даже если я ее вконтроллере буду осуществлять, видимо недостаточно аргументов для ее осуществления, я просто пытался понять почему открывается шаблон логина во время вот этого действия
$this->auth->authenticate();
Разве это не приказ просто аутентифицировать пользователя?
По большому счету выносить в контроллер может и надо логику если работать педантично,
но в реалии ничего не поменяется и проблему с аутентификацией это не решит,
Может кто подскажет почему открылась форма логина? А лучше что нужно сделать чтобы аутентифицировать юзера,
может юзер аутентифицируется только при наличии пароля и мыла специальным методом, как тогда имитировать существование пароля и мыла если на момент аутентификации нет их и каким методом это все осуществляется
Изменено imediasun (30.09.2017 13:21:03)
Не в сети
Страницы 1