Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 28.09.2017 13:57:20

Middleware sms аутентификации

Помогите пожалуйста разобраться, создал 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)

Не в сети

#2 29.09.2017 07:19:03

Re: Middleware sms аутентификации

я думаю, твоя принципиальная ошибка – в том что ты это делаешь внутри миддлвари. этот код на 100% должен находиться в контроллере и иметь свой собственный экшен, и не один. вторая ошибка – то что разные действия совершаются в одном методе – отправка кода и его проверка – это разные экшены, в-третьих с параметрами запроса надо работать через объект Request, а не лазить в $_POST, чай не на PHP4 пишешь…

на этапе выполнения миддлвари нет гарантии что состояние авторизации уже считано из сессии и что сессия вообще проинициализирована – за это также отвечают миддлвари и порядок их выполнения в данном конкретном случае имеет значение. на этапе выполнения экшена в контроллере инициализация заведомо завершена полностью – там и должен находиться твой код, в необходимости выносить его в миддлварь нет никаких оснований…

Не в сети

#3 29.09.2017 12:23:42

Re: Middleware sms аутентификации

Все понятно - спасибо за совет но вот авторизация все равно не произойдет даже если я ее вконтроллере буду осуществлять, видимо недостаточно аргументов для ее осуществления, я просто пытался понять почему открывается шаблон логина во время вот этого действия

$this->auth->authenticate();

Разве это не приказ просто аутентифицировать пользователя?
По большому счету выносить в контроллер может и надо логику если работать педантично,
но в реалии ничего не поменяется и проблему с аутентификацией это не решит,
Может кто подскажет почему открылась форма логина? А лучше что нужно сделать чтобы аутентифицировать юзера,
может юзер аутентифицируется только при наличии пароля и мыла специальным методом, как тогда имитировать существование пароля и мыла если на момент аутентификации нет их и каким методом это все осуществляется

Изменено imediasun (30.09.2017 13:21:03)

Не в сети

Подвал раздела