Как настроить аутентификацию через SMS и Flask для самых-самых ленивых пользователей
Привет, Хабр!
Сегодня мы по шагам расскажем, как подключить проверку пользовательских данных с помощью одноразового пароля по SMS. Для этого будем использовать платформу MTC Exolve и фреймворк Flask. Такой метод легко внедрить в свой проект и сделать работу с простыми личными кабинетами удобной и максимально ненапряжной для пользователей.
Увы, многие пользователи не любят запоминать пароли, но им можно предложить вход по SMS
Часто онлайн-сервисы заменяют стандартную пару из логина и пароля на более удобный способ аутентификации — вход через номер телефона и одноразовый SMS-код. Подробно об этом мы говорили в прошлой статье. Уточним, что для повышения уровня защиты от хакерских и фишинговых атак лучше использовать более сложные механики. Цель фишинговых атак — завладеть личной информацией пользователей: паролями, данными банковских карт. Поэтому придется усложнять доступ к номеру телефона и SMS для злоумышленника. Мы же ограничимся основной схемой аутентификации, которая подойдет для редких и разовых входов в простые личные кабинеты без важных персональных данных. В дальнейшем ее можно использовать и как элемент более сложных способов аутентификации.
Для пользователей вход по коду из SMS удобен тем, что не нужно вспоминать логин, пароль или данные паспорта — достаточно ввести номер телефона и получить одноразовый код.
Дополнительно пользователю можно отправить SMS-уведомление о подозрительной активности — например, попытке входа с неизвестных устройств или из других географических локаций. Это значит, что человек сможет быстро среагировать на потенциальные угрозы и принять меры по защите аккаунта.
Ниже мы расскажем, как настроить аутентификацию с помощью SMS API от платформы MTC Exolve и фреймворка Flask. В этом примере мы покажем, как отправить одноразовый код на указанный номер телефона. Для этого понадобятся только API-ключ и номер телефона отправителя, который можно приобрести на нашей платформе.
Пример простой реализации отправки SMS с помощью Flask
Почему Flask? Он неплох для создания легкого примера, предлагает базовый набор инструментов, помогает сразу начать разработку и подходит для создания микросервисов. Если вы знаете только Python и нужна интеграция вашего проекта с другими сервисами, то как раз этот фреймворк подойдет идеально.
Посмотрим, как реализовать отправку кода на телефон пользователя и верификацию через SMS-код для последующей авторизации на примере Flask-приложения.
Для начала убедитесь, что у вас установлен Flask и библиотека requests: pip install Flask requests
Создание структуры
flasksms/
/venv
/templates
signup.html
verify.html
start.html
result.html
error.html
app.py
config.py
dev.env
Создание шаблонов
В директории templates
мы создадим пять шаблонов:
signup.html
для ввода номера телефона.start.html
для стартовой страницы.error.html
на случай ввода неверного кода.result.html
для получения страницы с персональными данными.verify.html
для ввода полученного SMS-кода.
Вы можете стилизовать эти шаблоны в соответствии с вашим дизайном.
Создание приложения
Файл app.py
будет содержать логику Flask-приложения.
Дальше создадим маршруты для стартовой страницы, отправки SMS-кода и верификации кода. Кроме того, добавим словарь generated_codes
для хранения сгенерированных кодов.
Получим данные из переменных окружения в файл config.py
:
from dotenv import dotenv_values
info_env = dotenv_values('dev.env')
API_KEY = info_env.get('API_KEY')
PHONE_SEND = info_env.get('PHONE_SEND')
Создадим стартовый маршрут в app.py
:
from flask import Flask, render_template, request, jsonify
import requests
import random
import string
from config import API_KEY, PHONE_SEND
app = Flask(__name__)
# Секретный ключ приложения
app.secret_key = API_KEY
# Номер телефона для отправки кода
phone_send = PHONE_SEND
# Словарь для хранения сгенерированных кодов
generated_codes = {}
@app.route('/', methods=['GET'])
def start():
return render_template('start.html')
Стартовый шаблон в html сделаем таким:
Добро пожаловать
Добро пожаловать
Простое приложение flask для получения персональных данных с помощью одноразового SMS-кода
Для получения персональных данных перейдите по ссылке здесь.
--------------------------------------------------------------
Потом создадим маршрут /singup для получения номера телефона:
@app.route('/signup', methods=['GET', 'POST'])
def signup():
if request.method == 'POST':
number = request.form['number']
# Генерируем случайную последовательность из 5 латинских букв
code = ''.join(random.choice(string.ascii_letters) for _ in range(5))
# Отправляем SMS сгенерированным кодом
sms_data = {
"number": phone_send,
"destination": number,
"text": code}
headers = {'Authorization': f'Bearer {API_KEY}'}
response = requests.post(url="https://api.exolve.ru/messaging/v1/SendSMS",
json=sms_data, headers=headers)
if response.status_code == 200:
# Сохраняем сгенерированный код для дальнейшей проверки
generated_codes[number] = code
return render_template('verify.html', number=number)
else:
return f"Ошибка при отправке SMS: {response.status_code}"
return render_template('signup.html')
Переменную number будем забирать из тега input шаблона signup.html
:
SMS Signup
Доступ к данным по SMS
Командой requests.post(url="https://api.exolve.ru/messaging/v1/SendSMS", json=sms_data, headers=headers)
отсылаем запрос на отправку SMS по номеру, введенному в форму. В заголовках headers указываем тип авторизации и API-ключ приложения.
Если отправка SMS прошла успешно, перебрасываем пользователя на шаблон verify.html
.
Теперь создадим маршрут для сверки сгенерированного кода и кода, который ввел пользователь:
@app.route('/verify/', methods=['GET', 'POST'])
def verify(number):
if request.method == 'POST':
entered_code = request.form['code']
if number in generated_codes and entered_code == generated_codes[number]:
pasport = ''.join(str(random.randint(0, 9)) for _ in range(10))
credit = ''.join(str(random.randint(0, 9)) for _ in range(16))
data = {"номер счета”: credit, "номер паспорта”: pasport}
return render_template('result.html', data=data)
else:
return render_template('error.html')
return render_template('verify.html', number=number)
Раз мы перебросили пользователя на страницу verify.html, то ее стоит доработать. Ниже стили, которые вы можете исправить по вкусу:
Подтверждение
Подтверждение кода
Дальше в теге input ожидаем ввод кода и кнопкой button посылаем код на маршрут /verify/
Конечно, в реальном проекте будет база данных с привязкой номера пользователя и информацией о нем. Тут мы просто показываем возможности, поэтому используем случайно сгенерированные числа:
Номер счета
{{ data['номер счета'] }}
Номер паспорта
{{ data['номер паспорта'] }}
Если код неверный, вернем пользователю страницу error.html
с ошибкой и предложением попробовать снова:
Попробуйте снова
В каких еще ситуациях применяется OTP через SMS
Двухфакторная аутентификация, про которую писали раньше. Одноразовый код через SMS можно использовать дополнительно к имени пользователя и паролю.
Проверка номера телефона. Некоторые службы используют номер телефона в качестве основного идентификатора пользователя. В таких сервисах пользователи могут ввести свой номер телефона и одноразовый пароль, чтобы подтвердить свою личность. Иногда он сочетается с PIN-кодом для двухфакторной аутентификации.
Восстановление аккаунта. Если пользователь потерял доступ к своей учетной записи, он может восстановить ее через отправку email или SMS-сообщения.
Подтверждение платежа. В платежных системах некоторые банки или эмитенты кредитных карт запрашивают у плательщика дополнительную аутентификацию в целях безопасности. Обычно в таких случаях используют push или SMS с одноразовым кодом.
На этом все, если у вас возникли вопросы по использованию платформы MTS Eхolve, то ждем их в комментариях.
Р. S. Через облачную платформу МТС Exolve можно реализовать разные сценарии общения с клиентами: обратный звонок, кол-трекинг, защиту номера, выбор исходящего номера, SMS-информирование и другие. Что еще можно почитать на Хабре про Exolve: