[Программирование микроконтроллеров, Умный дом, DIY или Сделай сам, Электроника для начинающих] Micropyserver. Реализуем Basic Auth для IoT устройств
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Что такое micropyserver? Micropyserver - это простая библиотека для реализации HTTP сервера на базе устройств типа ESP8266 или ESP32 написанная на Micropython. Скачать ее можно тут: https://github.com/troublegum/micropyserverЧто пытаемся сделать? Часто нужно ограничить доступ к веб-интерфейсу своего IoT устройства из вне, так как в интерфейсе могут располагаться элементы управления или данные которые мы не хотим сделать доступными внешнему миру. Стандартном средством ограничения доступа к веб-интерфейсу служит метод аутенфикации, т.е. для доступа к нашему устройству мы будем спрашивать логин и пароль пользователя. Для решения задачи аутенфикации мы воспользуемся таким механизмом как Basic Auth, этот метод самый простой в реализации так как не требует ни использования cookies, ни наличия механизма сессий, ни специальной HTML страницы и формы для аутенфикации. Что такое Basic Auth? Механизм Basic Auth поддерживается всеми современными браузерами. Он не обеспечивает защиту конфиденциальности передаваемых учетных данных. Логин и пароль пользователя просто закодированы с помощью Base64 в HTTP заголовке с названием Authorization, они не зашифрованы и не хэшируются каким - либо образом. Поэтому для повышения безопасности этот механизм лучше использовать в сочетании с безопасным протоколом HTTPS. Поскольку данные о пароле и логине должны быть отправлены в заголовке каждого HTTP-запроса, веб-браузеру необходимо кэшировать введенные учетные данные в течение разумного периода времени, чтобы избежать постоянного запроса пользователя на ввод имени пользователя и пароля. Политика кеширования различается в зависимости от браузера. В современных браузерах кэшированные учетные данные для базовой проверки подлинности обычно очищаются при очистке истории просмотров. Большинство браузеров позволяют пользователям специально очищать только учетные данные, хотя этот параметр может быть трудно найти, и обычно очищает учетные данные для всех посещаемых сайтов. На стороне браузера механизм авторизации построен следующим образом:
- Логин и пароль объединяются одним двоеточием (:). Это означает, что само имя пользователя не может содержать двоеточие;
- Результирующая строка кодируется в последовательность октетов. Набор символов, используемый для этой кодировки, по умолчанию не указан, если он совместим с US-ASCII, но сервер может предложить использовать UTF-8, отправив параметр charset;
- Результирующая строка кодируется с использованием Base64;
- Затем к закодированной строке добавляется метод авторизации и пробел (например, «Basic»);
Например, если браузер использует Aladdin в качестве логина и open sesame в качестве пароля, то значение поля - это кодировка Base64 для Aladdin:open sesame или QWxhZGRpbjpvcGVuIHNlc2FtZQ== . Тогда заголовок авторизации будет выглядеть так: Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== Со стороны сервера обработка запроса авторизации происходит так:
- когда сервер хочет, чтобы браузер аутентифицировал себя по отношению к серверу, сервер должен соответствующим образом отвечать на не аутентифицированные запросы;
- для запросов, не прошедших аутентификацию, сервер должен возвращать ответ, заголовок которого содержит статус HTTP 401 Unauthorized и заголовок WWW-Authenticate;
Реализуем Basic Auth Теперь, когда стал понятен механизм авторизации, давайте напишем реализацию авторизации с использованием библиотеки HTTP сервера micropyserver. Для хранения связи пароль/логина мы будем использовать json формат данных и хранить их в отдельном от кода файле с названием credentials.json:
{
"user": "admin",
"password": "admin"
}
Это позволит нам использовать один и тот же код с разными значениями логина и пароля для нескольких устройств. Сам код будет располагаться в файле main.py:
from micropyserver import MicroPyServer
import re
import base64
import json
import network
import esp
wlan_id = "your wi-fi"
wlan_pass = "your password"
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
while not wlan.isconnected():
wlan.connect(wlan_id, wlan_pass)
print("Connected... IP: " + wlan.ifconfig()[0]);
server = MicroPyServer()
''' secret page '''
def my_secret_page(request):
server.send("MY SECRET PAGE")
''' add route '''
server.add_route("/", my_secret_page)
def on_request(request, address):
''' authorization '''
headers = request.split("\r\n")
need_auth = True
for header in headers:
authorization_header = re.search("^Authorization:\\s+Basic\\s+(.+)", header)
if authorization_header is None:
continue
credentials_base64_str = authorization_header.group(1)
if credentials_base64_str:
credentials_pair = base64.b64decode(credentials_base64_str.encode("utf8")).decode("utf8")
user_credentials = credentials_pair.split(":")
with open("credentials.json", "r") as credentials_file:
credentials = json.load(credentials_file)
need_auth = credentials["user"] != user_credentials[0] or credentials["password"] != user_credentials[1]
if need_auth:
server.send("HTTP/1.0 401\r\n")
server.send("WWW-Authenticate: Basic realm='User Visible Realm'\r\n\r\n")
return False
else:
return True
''' add on request handler '''
server.on_request(on_request)
''' start server '''
server.start()
Что мы сделали в этом примере? Мы использовали обработчик запросов on_request, который вызывается при каждом запросе пользователя. В нем проверяем мы правильность логина и пароля и если они не правильные, то отсылаем заголовки требующие авторизацию: HTTP 401 Unauthorized и WWW-Authenticate и возвращаем False, что бы сказать серверу, что бы он дальше не обрабатывал запрос. Если логин и пароль правильные, то не отсылаем никакие заголовки и просто возвращаем True в обработчике.Пробуем кодЕсли ввести в браузере http://IP-УСТРОЙСТВА, то мы получим предложение ввести логин и пароль, что бы получить доступ к устройству вам надо ввести логин admin и пароль admin (см. файл сredentials.json) и только после этого вы попадёте на секретную страницу на которой будет написано "MY SECRET PAGE".Что можно улучшить?У нас есть небольшая проблема, мы храним связку логин пароль в открытом виде, но по-хорошему нам надо хранить пароль в зашифрованном виде, допустим в виде значения хеша md5 и при проверке авторизации сравнивать именно хеши полученного и сохраненного пароля. Зачем? Для того что бы при краже или взломе устройства наш пароль не стал известен злоумышленнику. Но это уже для тех, кто хочет еще более сделать безопасным свое устройство, для большинства пользователей думаю будет это излишне. Разлогин HTTP протокол не предоставляет веб-серверу метод, позволяющий клиенту «выйти из системы». Однако существует ряд методов для очистки кешированных учетных данных в определенных веб-браузерах. Один из них - перенаправление пользователя на URL-адрес в том же домене с использованием намеренно неверных учетных данных. Однако такое поведение несовместимо между различными браузерами и версиями браузеров.
===========
Источник:
habr.com
===========
Похожие новости:
- [Тестирование IT-систем, Python, Тестирование веб-сервисов] Тестирование скриншотами
- [CAD/CAM, Производство и разработка электроники, Электроника для начинающих] Невидимые полигоны
- [C++, API, Прототипирование, 3D-принтеры, DIY или Сделай сам] Счетчик подписчиков Telegram с звуковым уведомление
- [Беспроводные технологии, Носимая электроника, DIY или Сделай сам, Электроника для начинающих] Снова о автономной Arduino-метеостанции на батарейках
- [Open source, Разработка игр, ООП, Развитие стартапа] Idewavecore. Ретроспектива
- [DIY или Сделай сам] Делаем гибкую печатную плату
- [Python, Гаджеты, Искусственный интеллект, DIY или Сделай сам] Как за 60$ создать систему распознавания лиц с помощью Python и Nvidia Jetson Nano 2GB (перевод)
- [Носимая электроника, Медгаджеты, Здоровье] Стартап создал наклейку для измерения потери жидкости во время тренировок
- [Разработка систем связи, Программирование микроконтроллеров] Составное устройство USB на STM32. Часть 1: Предпосылки
- [Python, Программирование, Big Data, Визуализация данных, Звук] Популярность BPM в разных жанрах музыки. Анализ скорости исполнения 500 лучших песен
Теги для поиска: #_programmirovanie_mikrokontrollerov (Программирование микроконтроллеров), #_umnyj_dom (Умный дом), #_diy_ili_sdelaj_sam (DIY или Сделай сам), #_elektronika_dlja_nachinajuschih (Электроника для начинающих), #_micropython, #_elektronika (электроника), #_mikrokontrollery (микроконтроллеры), #_umnyj_dom (умный дом), #_esp8266, #_esp32, #_python, #_sdelaj_sam (сделай сам), #_programmirovanie_mikrokontrollerov (
Программирование микроконтроллеров
), #_umnyj_dom (
Умный дом
), #_diy_ili_sdelaj_sam (
DIY или Сделай сам
), #_elektronika_dlja_nachinajuschih (
Электроника для начинающих
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 05:59
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Что такое micropyserver? Micropyserver - это простая библиотека для реализации HTTP сервера на базе устройств типа ESP8266 или ESP32 написанная на Micropython. Скачать ее можно тут: https://github.com/troublegum/micropyserverЧто пытаемся сделать? Часто нужно ограничить доступ к веб-интерфейсу своего IoT устройства из вне, так как в интерфейсе могут располагаться элементы управления или данные которые мы не хотим сделать доступными внешнему миру. Стандартном средством ограничения доступа к веб-интерфейсу служит метод аутенфикации, т.е. для доступа к нашему устройству мы будем спрашивать логин и пароль пользователя. Для решения задачи аутенфикации мы воспользуемся таким механизмом как Basic Auth, этот метод самый простой в реализации так как не требует ни использования cookies, ни наличия механизма сессий, ни специальной HTML страницы и формы для аутенфикации. Что такое Basic Auth? Механизм Basic Auth поддерживается всеми современными браузерами. Он не обеспечивает защиту конфиденциальности передаваемых учетных данных. Логин и пароль пользователя просто закодированы с помощью Base64 в HTTP заголовке с названием Authorization, они не зашифрованы и не хэшируются каким - либо образом. Поэтому для повышения безопасности этот механизм лучше использовать в сочетании с безопасным протоколом HTTPS. Поскольку данные о пароле и логине должны быть отправлены в заголовке каждого HTTP-запроса, веб-браузеру необходимо кэшировать введенные учетные данные в течение разумного периода времени, чтобы избежать постоянного запроса пользователя на ввод имени пользователя и пароля. Политика кеширования различается в зависимости от браузера. В современных браузерах кэшированные учетные данные для базовой проверки подлинности обычно очищаются при очистке истории просмотров. Большинство браузеров позволяют пользователям специально очищать только учетные данные, хотя этот параметр может быть трудно найти, и обычно очищает учетные данные для всех посещаемых сайтов. На стороне браузера механизм авторизации построен следующим образом:
{
"user": "admin", "password": "admin" } from micropyserver import MicroPyServer
import re import base64 import json import network import esp wlan_id = "your wi-fi" wlan_pass = "your password" wlan = network.WLAN(network.STA_IF) wlan.active(True) while not wlan.isconnected(): wlan.connect(wlan_id, wlan_pass) print("Connected... IP: " + wlan.ifconfig()[0]); server = MicroPyServer() ''' secret page ''' def my_secret_page(request): server.send("MY SECRET PAGE") ''' add route ''' server.add_route("/", my_secret_page) def on_request(request, address): ''' authorization ''' headers = request.split("\r\n") need_auth = True for header in headers: authorization_header = re.search("^Authorization:\\s+Basic\\s+(.+)", header) if authorization_header is None: continue credentials_base64_str = authorization_header.group(1) if credentials_base64_str: credentials_pair = base64.b64decode(credentials_base64_str.encode("utf8")).decode("utf8") user_credentials = credentials_pair.split(":") with open("credentials.json", "r") as credentials_file: credentials = json.load(credentials_file) need_auth = credentials["user"] != user_credentials[0] or credentials["password"] != user_credentials[1] if need_auth: server.send("HTTP/1.0 401\r\n") server.send("WWW-Authenticate: Basic realm='User Visible Realm'\r\n\r\n") return False else: return True ''' add on request handler ''' server.on_request(on_request) ''' start server ''' server.start() =========== Источник: habr.com =========== Похожие новости:
Программирование микроконтроллеров ), #_umnyj_dom ( Умный дом ), #_diy_ili_sdelaj_sam ( DIY или Сделай сам ), #_elektronika_dlja_nachinajuschih ( Электроника для начинающих ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 05:59
Часовой пояс: UTC + 5