Этот репозиторий предоставляет сервер аутентификации, предназначенный для управления аутентификацией пользователей и сессиями в контейнерной среде с использованием Docker и Nginx.
Приложение работает на базе Flask с балансировкой нагрузки через Gunicorn внутри контейнера.
-
Управление сессиями:
- Пользователи получают токен сессии (cookie) после успешной аутентификации.
- Сессии имеют стандартное время жизни в 10 минут, которое автоматически продлевается при каждом успешном запросе.
- При неуспешной аутентификации пользователи перенаправляются на страницу входа.
-
Интеграция с Nginx:
- Аутентификация запросов через
auth_request
. - Перенаправление неаутентифицированных пользователей на страницу входа.
- Аутентификация запросов через
-
Хранение сессий в Redis:
- Redis используется для хранения данных сессий.
- Встроенная конфигурация Redis включена в
compose.yaml
.
-
Настраиваемость:
- Время жизни сессии, её продление и другие параметры задаются через переменные окружения.
- Поддерживаются статические и динамические пути для страницы входа и статических файлов.
- Docker
- Docker Compose
- Nginx
-
Клонируйте репозиторий:
git clone <repository_url> cd <repository_folder> docker buildx build -t auth_server .
-
Настройте переменные окружения (файл
./dsas.env
):# Режим работы Flask (development/production) FLASK_ENV=production # Путь к статическим стилям STYLE_FOLDER=dsas_static # Язык по умолчанию (en/ru/fr/de/es/it/zh) # Специальные языки: "redneck_us, irish_gang, imperial_ru, soviet_ru" APP_LANGUAGE=ru # Тема оформления (light/dark/imperial/soviet/cyberpunk/glass) STYLE_THEME=light # Время жизни сессий SESSION_LIFETIME=600 # Время жизни по умолчанию SESSION_EXTENSION=300 # Продление сессии после успешной аутентификации SESSION_MAX_LIFETIME=86400 # Максимальное время жизни
-
Запустите контейнеры:
docker-compose up -d
-
Настройте Nginx:
server {
server_name authtest.local;
location @login {
return 302 /dsas_login?next=$request_uri;
}
location / {
auth_request /dsas_auth;
error_page 401 500 = @login;
## Здесь ваш код ##
proxy_pass http://127.0.0.1:8080; # <- Пример
}
# "dsas_login" может быть любым, но должен совпадать с @login
location /dsas_login {
proxy_pass http://127.0.0.1:5000/login;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Локация для статического контента, определена в dsas.env
location /dsas_static/ {
proxy_pass http://127.0.0.1:5000/static/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# "dsas_auth" должно совпадать с директивой auth_request
location = /dsas_auth {
internal;
proxy_pass http://127.0.0.1:5000/check_token;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header Cookie $http_cookie;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
-
(опционально) Обновите файл
/etc/hosts
:127.0.0.1 authtest.local
-
Вход и выдача токена:
- Пользователи входят через
/dsas_login
. - При успешном входе они получают токен сессии, который сохраняется в cookie.
- Пользователи входят через
-
Проверка сессии:
- Все запросы проходят проверку на конечной точке
/dsas_auth
. - При успешной проверке время жизни сессии продлевается.
- При неуспешной проверке пользователи перенаправляются на страницу входа.
- Все запросы проходят проверку на конечной точке
-
Хранение данных сессии:
- Данные сессий хранятся в Redis.
- Redis хранит идентификатор сессии, данные пользователя и время начала сессии.
Для управления пользователями используйте скрипт manage.py
, расположенный в корневой папке проекта.
-
Добавить нового пользователя:
./manage.sh add <username> <password>
-
Удалить существующего пользователя:
./manage.sh delete <username>
-
Обновить пароль пользователя:
./manage.sh update <username> <new_password>
-
Вывести список пользователей:
./manage.sh list
-
Данные пользователей:
- Данные о пользователях хранятся в
data/.htpasswd
. - Пароли надёжно хэшируются с использованием алгоритма
scrypt
. - Убедитесь, что для сохранения данных после пересоздания контейнера вы используете тома, подключённые к
/app/data
.
- Данные о пользователях хранятся в
-
Работа скрипта:
- Скрипт работает только при имени контейнера
auth_server
. - Если имя контейнера другое, используйте:
docker exec -it <имя_вашего_контейнера> python manage.py
- Скрипт работает только при имени контейнера
Чтобы использовать собственный сервер Redis, обновите следующую строку в app.py
:
app.config["SESSION_REDIS"] = redis.StrictRedis(host="your_redis_host", port=6379, decode_responses=True)