Авторизация по RFID-карте: 300 рублей и немного Python
Недавно купил за 300 рублей модуль RC522 — и сразу подумал: «А чё бы не сделать авторизацию через RFID-карту?» Не ради фантастики, а реально: разрешить вход в веб-интерфейс (например, админку IoT-системы) только если карта приложена.
Идея
- Карта приложена → скрипт Python записывает
1в файл (например,auth_status.txt). - Карта убрана → пишется
0. - PHP-интерфейс читает этот файл и решает: показывать форму входа или нет.
Просто. Дёшево. Работает даже без базы — хотя, конечно, в базу писать тоже можно.
Что нужно
- Raspberry Pi (любая модель с GPIO)
- Модуль RFID RC522
- Карта/брелок (идёт в комплекте)
- Библиотека
mfrc522для Python
Подключение RC522 к Raspberry Pi
| RC522 | Raspberry Pi (GPIO) |
|---|---|
| SDA | CE0 (GPIO8) |
| SCK | SCLK (GPIO11) |
| MOSI | MOSI (GPIO10) |
| MISO | MISO (GPIO9) |
| RST | GPIO25 |
| GND | GND |
| 3.3V | 3.3V |
Python-скрипт для записи статуса
Устанавливаем библиотеку:
pip3 install mfrc522
Сам скрипт (rfid_auth.py):
#!/usr/bin/env python3
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import time
reader = SimpleMFRC522()
auth_file = "/var/www/html/auth_status.txt" # Путь, доступный PHP
# Сюда можно вписать UID своей карты (получить через отладочный запуск)
AUTHORIZED_UID = 123456789 # ЗАМЕНИ НА СВОЙ!
try:
with open(auth_file, "w") as f:
f.write("0") # Сбрасываем статус при старте
print("Жду карту...")
while True:
id, text = reader.read_no_block()
if id:
if id == AUTHORIZED_UID:
with open(auth_file, "w") as f:
f.write("1")
print(f"Карта {id} — доступ разрешён")
else:
with open(auth_file, "w") as f:
f.write("0")
print(f"Неизвестная карта {id}")
else:
with open(auth_file, "w") as f:
f.write("0")
time.sleep(1)
finally:
GPIO.cleanup()
⚠️ Не забудь заменить AUTHORIZED_UID на настоящий UID своей карты! Узнать его можно, запустив простой пример из документации mfrc522.
PHP-проверка в веб-интерфейсе
Пример admin.php:
<?php
$auth_file = 'auth_status.txt';
$allowed = file_get_contents($auth_file) === "1";
if (!$allowed) {
die("Доступ запрещён. Приложите карту.");
}
?>
<h2>Админка IoT</h2>
<p>Вы авторизованы по RFID!</p>
<form method="post">
Логин: <input name="login"><br>
Пароль: <input type="password" name="pass"><br>
<input type="submit" value="Войти">
</form>
Как запускать
- Запусти скрипт в фоне:
nohup python3 rfid_auth.py & - Убедись, что у пользователя
www-dataесть права на чтениеauth_status.txt.
Варианты улучшения
- Запись в SQLite вместо файла — безопаснее и масштабируемее.
- Добавить таймер: если карта не обновляла статус 10 секунд — автоматически ставить
0. - Использовать несколько UID для разных пользователей.
Всё это можно собрать за вечер. И да — это реально работает даже в гараже 😉
Комментарии
Пока нет комментариев. Будьте первым!