Questo repository fornisce un server di autenticazione progettato per gestire l'autenticazione degli utenti e la gestione delle sessioni in un ambiente containerizzato utilizzando Docker e Nginx.
L'applicazione si basa sul modulo Flask e il bilanciamento del carico viene effettuato all'interno del container tramite Gunicorn.
-
Gestione delle sessioni:
- Gli utenti ricevono un token di sessione (cookie) dopo un'autenticazione riuscita.
- Le sessioni hanno una durata predefinita di 10 minuti, che viene automaticamente rinnovata dopo ogni richiesta riuscita.
- In caso di autenticazione non riuscita, gli utenti vengono reindirizzati alla pagina di accesso.
-
Integrazione con Nginx:
- Gestisce le richieste di autenticazione tramite
auth_request
. - Reindirizza gli utenti non autenticati alla pagina di accesso.
- Gestisce le richieste di autenticazione tramite
-
Archiviazione in Redis:
- Redis viene utilizzato per archiviare i dati delle sessioni.
- Una configurazione Redis integrata è inclusa in
compose.yaml
.
-
Personalizzabile:
- La durata delle sessioni, il tempo di estensione e altri parametri possono essere configurati tramite variabili di ambiente.
- Supporta percorsi statici e dinamici per la pagina di accesso e i file statici.
- Docker
- Docker Compose
- Nginx
-
Clonare il repository:
git clone <repository_url> cd <repository_folder> docker buildx build -t auth_server .
-
Configurare le variabili di ambiente (file
./dsas.env
):FLASK_ENV=production # Modalità Flask (development/production) STYLE_FOLDER=dsas_static # Percorso ai file statici APP_LANGUAGE=it # Lingua predefinita dell'applicazione STYLE_THEME=light # Tema predefinito (light/dark/imperial/soviet/cyberpunk/glass) SESSION_LIFETIME=600 # Durata predefinita delle sessioni (in secondi) SESSION_EXTENSION=300 # Estensione della sessione dopo autenticazione riuscita SESSION_MAX_LIFETIME=86400 # Durata massima delle sessioni (in secondi)
-
Avviare i container:
docker-compose up -d
-
Configurare 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;
## Il tuo codice è qui ##
proxy_pass http://127.0.0.1:8080; # <- Esempio
}
# "dsas_login" può essere chiamato in qualsiasi modo, ma deve corrispondere a @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;
}
# Posizione del contenuto statico definito in 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" deve corrispondere alla direttiva 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;
}
}
-
(opzionale) Aggiornare il file
/etc/hosts
:127.0.0.1 authtest.local
-
Accesso e emissione del token:
- Gli utenti accedono tramite
/dsas_login
. - Dopo un accesso riuscito, ricevono un token di sessione memorizzato in un cookie.
- Gli utenti accedono tramite
-
Validazione della sessione:
- Tutte le richieste sono autenticate tramite
/dsas_auth
. - In caso di validazione riuscita, la durata della sessione viene estesa.
- In caso di errore, gli utenti vengono reindirizzati alla pagina di accesso.
- Tutte le richieste sono autenticate tramite
-
Archiviazione delle sessioni:
- I dati delle sessioni sono archiviati in Redis.
- Redis memorizza l'ID della sessione, i dati dell'utente e l'orario di inizio della sessione.
Per gestire gli utenti, utilizzare lo script manage.py
situato nella directory principale del progetto.
-
Aggiungere un nuovo utente:
./manage.sh add <nome_utente> <password>
-
Eliminare un utente esistente:
./manage.sh delete <nome_utente>
-
Aggiornare la password di un utente:
./manage.sh update <nome_utente> <nuova_password>
-
Elencare tutti gli utenti:
./manage.sh list
Per utilizzare un server Redis personalizzato, modificare la seguente riga in app.py
:
app.config["SESSION_REDIS"] = redis.StrictRedis(host="tuo_host_redis", port=6379, decode_responses=True)
- I dati degli utenti sono archiviati in
data/.htpasswd
. - Le password sono memorizzate in modo sicuro utilizzando l'algoritmo
scrypt
. - Assicurarsi che i volumi siano collegati a
/app/data
per preservare i dati dopo la ricreazione dei container.