Здравствуте, написал проверку 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');
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
При подключении каждому пользователю присваиваю ID
Нужно вывести значение массива в selectКогда я вывожу оно делится на 3 столбика(red,blue,green)
Знаю, что в сети полно примеров, но, простого варианта без излишеств я не увидел, и, изначально это был простой вариант вкл/выкл через onclickПотом...
Доброго времени суток всемИмеется код, в нем по нажатию на кнопку копируется скрытый текст