Подправить логику проверки 2fa Auth (от гугл) php

94
10 февраля 2022, 12:00

Здравствуте, написал проверку 6 го кода при авторизации, так как делал это впервой, в голове есть замечания к некоторым нюансам:

Добавилось два запроса к базе: 1, в методе loginProcess() что бы проверить включена ли у пользователя 2fa auth или нет. 2, в методе auth2stepProcess() что бы узнать секретный ключ пользователя.

Добавилась еще одна сессия: В методе loginProcess() где происходит проверка на наличие включенной 2fa auth, в сессию записываются данные с формы авторизации, что бы добросить их к другому методу, а именно auth2stepProcess()

Ниже представлю методы с контроллера юзера, почистив их от попутных (не влияющих на картину) проверок, что бы сосредоточиться на нужном коде.

Вопросы: Как можно оптимизировать эти методы, например уменьшить кол-в. запросов к бд, и избежать например записи данных в сессию. и другие возможные полезные изменения.

Буду рад вашей помощи, если, что то не внятно или не понятно, прошу не выставлять минусы, а написать, что не так, спасибо.

    function login()
{
    if(user::i()->isLogged())
    {
        switch(APP_CODE)
        {
            case 'admin':
                location(APP_URL);
            break;
            default:
                location(APP_URL.'user/acount');
            break;
        }
    }
    $this->_template = 'users/login.tpl';
    $data = array();
    $secret = 'c6Pg4CWJ6LfFSJ4eb4Hc6Pg4CWJBUAAAAANdzzwSZJxaWBJ3';
    $this->assign('login_data', $data);
}
function loginProcess() // обработчик формы
{
    $data = $this->request; // получаем данные с формы

    $user = database::i()->user('login = ?', $data['login'])->fetch(); // запрос бд для того, что бы узнать включен ли у пользователя режим 2fa

    if ($user['google_protected'] != 'inactive') { // проверка на 2fa auth
        $_SESSION['data_login'] = $data;
        location(WS_FRONTEND.'/login/auth2step'); // отправляет на форму вводу 6 значного кода, метод auth2stepForm()
    }

    if($user = user::i()->login($data['login'], $data['password'])) // если у пользователя не включен 2fa просто авторизируем его
    {
        if(user::i()->isAdmin())
            location(WS_FRONTEND.'/admin');
        else
            location(WS_FRONTEND.'/user/acount');
    }
    else
    {
        user::i()->setFlash('users_login_error', array(
            'data' => $data
        ));
        location(APP_URL.'login');
    }
}
function auth2stepForm() // шаблон формы для 6 значнного кода
{
    $this->_template = 'users/auth2_form.tpl';
}
function auth2stepProcess() // обработчик формы где пользователь вводит 6 значный код
{
    $user = database::i()->user('login = ?', $_SESSION['data_login']['login'])->fetch(); // запрос в базу, что бы узнать секретный ключ пользователя
    $googleCode = $this->request; // получение данных с форму (6 значный код)
    $authenticator = new GoogleAuthenticator();
    $secret = $user['google_secret']; // получаем секретный ключ пользователя
    $tolerance = 2;

    $checkResult = $authenticator->verifyCode($secret, $googleCode['google_secret'], $tolerance);
        if ($checkResult) // если истина происходит тот же процесс, что и в методе loginProcess()
        {
            // копия с метода обработчика формы логина
            if($user = user::i()->login($_SESSION['data_login']['login'], $_SESSION['data_login']['password']))
            {
                if(user::i()->isAdmin())
                    location(WS_FRONTEND.'/admin');
                else
                    location(WS_FRONTEND.'/user/acount');
            }
            else
            {
                user::i()->setFlash('users_login_error', array(
                    'data' => $data
                ));
                location(APP_URL.'login');
            }
        }
        else
        {
            location(APP_URL.'login');

        }
}
READ ALSO
Проверить есть-ли пользователь в списке или нет Websocket?

Проверить есть-ли пользователь в списке или нет Websocket?

При подключении каждому пользователю присваиваю ID

79
Вывести массива в select

Вывести массива в select

Нужно вывести значение массива в selectКогда я вывожу оно делится на 3 столбика(red,blue,green)

69
Табы на чистом JS

Табы на чистом JS

Знаю, что в сети полно примеров, но, простого варианта без излишеств я не увидел, и, изначально это был простой вариант вкл/выкл через onclickПотом...

134
Div блок вылазит за границы страницы

Div блок вылазит за границы страницы

Доброго времени суток всемИмеется код, в нем по нажатию на кнопку копируется скрытый текст

69