Inloggen mislukte met DJANGO_SECURE=1 achter een reverse proxy die TLS afhandelt, terwijl het inlogscherm zelf wel laadde. - nginx.conf gaf `X-Forwarded-Proto $scheme` door. Achter een TLS-proxy komt het verzoek als http binnen, dus overschreef nginx de `https` van de proxy met `http`. Django zag de verbinding daardoor als onveilig en stuurde elk verzoek naar /api en /admin door naar https, waarna de proxy het weer als http aanleverde: een oneindige redirect-lus. - nginx neemt nu de X-Forwarded-Proto van de proxy over via een map, en valt alleen terug op $scheme als die header ontbreekt. Werkt daardoor zowel achter een externe proxy als bij TLS op nginx zelf. - .env.example: voorbeelden voor CSRF-origin en frontend-URL op https gezet, DJANGO_SECURE standaard op 1, met uitleg waarom een http-origin het inloggen met een CSRF-fout laat stranden. - DEPLOY.md: checklist "Draaien achter TLS" toegevoegd met de drie vereisten (proxy-header, CSRF-origin, allowed hosts), commando's om te controleren of de header aankomt, en het advies poort 8080 aan de loopback te binden zodat de app niet buiten TLS om bereikbaar is. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FAQ4Np13v8fwbTtKHKnwDz
48 lines
2.2 KiB
Text
48 lines
2.2 KiB
Text
# Kopieer dit bestand naar .env en vul echte waarden in.
|
|
# cp .env.example .env
|
|
# Het .env-bestand bevat geheimen en hoort NIET in git (staat in .gitignore).
|
|
|
|
# --- Django ---------------------------------------------------------------
|
|
# Genereer een sterke sleutel, bv.:
|
|
# python -c "import secrets; print(secrets.token_urlsafe(50))"
|
|
DJANGO_SECRET_KEY=vervang-mij-door-een-lange-willekeurige-string
|
|
|
|
# 0 = uit (zo hoort het op de test-/productieserver). 1 alleen lokaal debuggen.
|
|
DJANGO_DEBUG=0
|
|
|
|
# Hostnaam(en) waarop de server bereikbaar is, komma-gescheiden.
|
|
# Vervang door de echte naam/IP van je test-server.
|
|
DJANGO_ALLOWED_HOSTS=rooster-test.example.nl,localhost,127.0.0.1
|
|
|
|
# Volledige origin(s) inclusief http(s):// voor CSRF achter nginx.
|
|
# LET OP: dit moet exact de origin zijn die de browser gebruikt. Draai je met
|
|
# TLS, dan hoort hier https:// te staan (en zonder poort als je op 443 zit).
|
|
# Staat hier http:// terwijl de browser https:// gebruikt, dan mislukt elke
|
|
# POST — dus ook het inloggen — met een CSRF-fout.
|
|
DJANGO_CSRF_TRUSTED_ORIGINS=https://rooster.example.nl
|
|
|
|
# Zet op 1 zodra de server achter HTTPS draait (TLS-certificaat aanwezig).
|
|
# Activeert o.a. veilige cookies, HSTS en een redirect naar https.
|
|
# Vereist dat de reverse proxy X-Forwarded-Proto: https meestuurt; nginx.conf
|
|
# in dit project geeft die header door.
|
|
DJANGO_SECURE=1
|
|
|
|
# --- PostgreSQL -----------------------------------------------------------
|
|
POSTGRES_DB=rooster
|
|
POSTGRES_USER=rooster
|
|
POSTGRES_PASSWORD=vervang-mij-door-een-sterk-wachtwoord
|
|
|
|
# --- E-mail (o.a. wachtwoordreset) ---------------------------------------
|
|
# Laat DJANGO_EMAIL_BACKEND leeg/weg om e-mail naar de console-log te sturen
|
|
# (handig om te testen). Zet onderstaande regel aan voor échte e-mail via SMTP:
|
|
# DJANGO_EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
|
|
EMAIL_HOST=
|
|
EMAIL_PORT=587
|
|
EMAIL_HOST_USER=
|
|
EMAIL_HOST_PASSWORD=
|
|
EMAIL_USE_TLS=1
|
|
DEFAULT_FROM_EMAIL=Roosterwijs <noreply@jouwschool.nl>
|
|
# Basis-URL van de frontend voor resetlinks in e-mails (zonder slash op het eind),
|
|
# bv. https://rooster.example.nl (leeg = afleiden uit het verzoek).
|
|
# Met TLS: gebruik https://, anders wijzen resetlinks naar een http-adres.
|
|
FRONTEND_BASE_URL=
|