Un'applicazione che implementa un sistema sicuro di accesso passwordless, con inviti via email e protezione tramite rate limiting e API Key.
- Richiesta invito via email
- Registrazione con codice invito
- Login passwordless
- Verifica token JWT e generazione access token
- Accesso a risorse protette tramite JWT
- API protette da API Key e rate limiting
- FastAPI
- JWT (
python-jose) - Rate limiting (
slowapi) - Invio email personalizzato
- Protezione con API Key
- React
- React Router
- Componenti:
UserLogin,UserRegister,UserRequestInvite
-
Clona la repo:
git clone https://github.com/maxigiacc/Progetto_Sicurezza.git cd Progetto_Sicurezza/app -
Crea e attiva un ambiente virtuale:
python -m venv venv source venv/bin/activate -
Installa le dipendenze:
pip install -r ../requirements.txt -
Avvia il backend, nella root del progetto:
python -m uvicorn app.main:app --reload
-
Apri un nuovo terminale e vai nella cartella:
cd ../frontend -
Installa le dipendenze:
npm install -
Avvia l'app:
npm start
| Metodo | Endpoint | Descrizione |
|---|---|---|
| POST | /request-invite | Invia un codice invito via email |
| POST | /register | Registra l’utente con codice invito |
| POST | /login | Invia token per autenticazione |
| GET | /verify?token=... | Verifica token e genera access token JWT |
| GET | /protected | Accesso risorsa protetta con JWT |
Tutte le richieste devono includere l’header:
Authorization: SUPERSEGRETO
- L’utente inserisce la sua email nel frontend.
- Il backend genera un codice casuale e lo invia tramite email.
- L’utente inserisce il codice ricevuto e la sua email.
- Se valido e non scaduto, l’utente viene creato.
- L’utente inserisce solo l’email.
- Il server genera un token monouso temporaneo (firmato con chiave segreta).
- L’utente riceve il token via email (anche su Ethereal per test).
- L’utente incolla il token nel frontend.
- Il server verifica il token e restituisce un JWT.
- Il JWT viene usato per accedere ad endpoint protetti.
- Rate limit per il login: 5 richieste al minuto
- Accesso solo con codice invito
- Login passwordless con token temporaneo
- JWT per accesso autenticato
- Protezione tramite API Key in tutte le chiamate
Per il corretto funzionamento dell'invio email, è necessario creare un file .env nella cartella app/ con il seguente contenuto:
SECRET_KEY="una_chiave_super_segreta"
EMAIL_FROM="la_tua_email@gmail.com"
MAIL_USERNAME="la_tua_email@gmail.com"
MAIL_PASSWORD="password_dell_app"
MAIL_SERVER="smtp.gmail.com"
MAIL_PORT=587
MAIL_FROM_NAME="Progetto Sicurezza"
MAIL_STARTTLS=True
USE_CREDENTIALS=True
VALIDATE_CERTS=True
Per usare un account Gmail in sicurezza, non devi usare la tua password normale, ma una password per le app:
- Vai su https://myaccount.google.com/apppasswords
- Accedi con il tuo account Google
- Seleziona l'app (es. "Mail") e il dispositivo (es. "Altro – Progetto Sicurezza")
- Google genererà una password a 16 caratteri
- Usa quella password nel campo
MAIL_PASSWORDdel tuo.env
Le password per le app richiedono che l’autenticazione a due fattori sia attiva sul tuo account Google.
Non condividere questo file pubblicamente. Assicurati di aggiungerlo a
.gitignore.
Puoi usare un account fittizio con Ethereal Email solo per test:
- Vai su https://ethereal.email/create
- Crea un account temporaneo (ti darà username, password, host, port)
- Inserisci questi dati nel file
.env:
EMAIL_FROM="utente@ethereal.email"
MAIL_USERNAME="utente@ethereal.email"
MAIL_PASSWORD="la_password"
MAIL_SERVER="smtp.ethereal.email"
MAIL_PORT=587
MAIL_FROM_NAME="Progetto Sicurezza"
MAIL_STARTTLS=True
USE_CREDENTIALS=True
VALIDATE_CERTS=True
Ethereal serve solo per test: le email non vengono effettivamente consegnate all’utente, ma visualizzate nella mailbox relativa all'utente ethereal creato.