Для учета клиентов и сайтов мы используем собственную CRM-систему. Конечно, она не такой монстр как популярные crm-системы, типа AmoCRM, но свою задачу выполняет. Для улучшения безопасности и исключения возможности подбора паролей внедрили систему одноразовых паролей, через отправку сообщений Телеграм бота. В данной статье мы объясним, как внедрить эту систему для вашего сайта.
Принцип работы
Прошло около 7 лет после написания статьи об идеальной системе авторизации. Но теперь мы еще упростим процесс входа на сайт. При авторизации в систему появляется поле только с логином.
После ввода логина и нажатия кнопки «Войти» поле логина заменяется на поле ввода пароля, а в Телеграм приходит сообщение с новым паролем. После ввода пароля происходит авторизация.
Создание бота Телеграм
Прежде чем начинать разработку, бота необходимо зарегистрировать и получить его уникальный id, являющийся одновременно и токеном. Для этого в Telegram существует специальный бот — @BotFather.
Пишем /start и выйдет список всех команд этого бота.
Нужная нам — /newbot — отправляем ему и бот просит придумать имя нашему новому боту. Единственное ограничение на имя — оно должно оканчиваться на «bot». В случае успеха BotFather возвращает токен бота и ссылку для быстрого добавления бота в контакты, иначе придется поломать голову над именем.
В поисковике много подробных инструкций по созданию ботов, поэтому мы не будем заострять на этом внимания.
Реализация системы
Ниже приведены примеры кода реализации данной системы. Для удобства код очищен от лишних классов и html тегов.
Файл login.php
<form action="login_controller.php" id="loginform" method="post">
<input id="login" type="text" name="login" placeholder="Логин" required>
<div id="pass"></div>
<button id="submit" type="submit"> Войти</button>
</form>
Обратите внимание на div с id «pass». В него будет вставлено поле с вводом пароля.
<script src="jquery.min.js"></script>
Для реализации появления поля с паролем мы воспользовались библиотекой jquery. Не забудьте ее подключить.
Ниже показан скрипт обработки ввода данных.
<script>
$(document).ready(function() {
$("#loginform").on("submit", function(event) {
var $result = $('#pass');
var login = $("#login").val();
if ((login != '') && (login.length > 1)) {
event.preventDefault();
$.ajax({
url: 'login_controller.php’,
method: 'post',
dataType: 'html',
data: {login: login},
success: function(msg){
$result.html(msg);
document.getElementById("login_block").remove();
if(msg != ''){
$result.fadeIn();
} else {
$result.fadeOut(100);
}}});
} else {
$result.html('');
$result.fadeOut(100);
}
})
});
</script>
Файл login_controller.php
/*Если введен логин*/
if(isset($_POST['login'])) {
$login = $_POST['login'];
if($login == '') {unset($login);}
/*Очищаем данные от мусора*/
$login = stripslashes($login);
$login = htmlspecialchars($login);
$login = trim($login);
$login = mb_strtolower($login);
/*Проверка на существование логина. У нас реализован класс для логина. У вас может быть своя реализация логина, поэтому свой класс приводить не будем*/
$me = new Login();
$login_name = $me->login_name($login);
if(empty($login_name['id'])) {
/*Если не существует такой пользователь, то выводим поле логина снова*/
echo '<input id="login" type="text" name="login" placeholder="Логин">';
}else{
//генерация рандомного 6-значного числа для Телеграм
$allowedNumbers = range(0, 9);
$digits = array_rand($allowedNumbers, 6);
$number = '';
foreach($digits as $d){
$number .= $allowedNumbers[$d];
}
$_SESSION['login'], = $login;
$me->setLoginPassowrd($login,$number);//установка нового пароля
function message_to_telegram($text)
{ $ch = curl_init();
curl_setopt_array(
$ch,
array(
CURLOPT_URL => 'https://api.telegram.org/bot99999999:Сюда вводится ваш токен /sendMessage',
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 10,
CURLOPT_POSTFIELDS => array(
'chat_id' => 23233432,/*id чата*/
'text' => $text,
),
)
);
curl_exec($ch);
}
message_to_telegram('Вход в систему: '.$number);//отправка кода в телеграм
echo '<input type="password" name="password" placeholder="Пароль" required>';
}
}
/*Если введен пароль*/
if(isset($_POST['password'])) {
$password = $_POST['password']; if($password == '') { unset($password); }
$password = stripslashes($password);
$password = htmlspecialchars($password);
$me = new Login();
$login_pass = $me->password($_SESSION['login'],$password);
if(empty($login_pass['id'])) {
echo 'пароль не верный';
}else{
header("Location: dashboard.php");
}
}
Вывод
Довольно простой пример и реализация. Реализация данной системы возможна для различных CMS и самописных систем.
Недостатки системы:
- Каждому пользователю придется регистрировать чат бота, поэтому удобно пользоваться данным способом, когда число пользователей не большое.
- Для пользования системой придется установить приложение Телеграм. Для обычной авторизации этого не требуется либо достаточно почты.
Плюсы системы:
- Практически невозможно взломать методом подбора.
- Не надо запоминать пароль, ведь каждый раз пароль новый.