Din documentatie:
Când utilizatorul final și-a completat detaliile de conectare, formularul va face o solicitare HTTP POST către adresa URL inițială protejată prin parolă. mod_auth_form va intercepta această solicitare POST, iar dacă sunt găsite câmpuri HTML prezente pentru numele de utilizator și parolă, utilizatorul va fi conectat, iar URL-ul original protejat prin parolă va fi returnat utilizatorului ca cerere GET.
Am o alergare la port 45001
și apache reverse-proxing la acesta. Folosesc autentificarea prin formulare și ErrorDocument
pentru a impune autentificarea. Aceasta este configurația mea:
<VirtualHost myip:44302>
ServerName myserver.com
# Pass auth info
RequestHeader set X-Remote-User %{REMOTE_USER}s
# Login page is directly on the server - don't use reverse proxy
ProxyPass /login/ !
# Proxy all requests to the app running in a docker container
ProxyPreserveHost On
ProxyPass / http://localhost:45001/
ProxyPassReverse / http://localhost:45001/
# Require auth for all requests except the login page
<LocationMatch ^/(?!login).*$>
AuthType form
AuthName "login"
AuthFormProvider ldap
AuthLDAPURL <url>
AuthLDAPBindAuthoritative off
# Redirecting to login page if auth is needed
ErrorDocument 401 /login/index.html
# If authorization fails, return 403 insead of 401
AuthzSendForbiddenOnFailure On
# Use session cookie
Session On
SessionCookieName session path=/;httponly;
SessionCryptoPassphrase <passphrase>
Require valid-user
</LocationMatch>
</VirtualHost>
Formular (simplificat de clase și div wrapper):
<form action="" method="POST">
<input name="httpd_username" type="text">
<input name="httpd_password" type="password">
<button type="submit">
Login
</button>
</form>
Pentru alte scenarii, în care nu folosesc proxy invers, fluxul de lucru este corect:
- URL de acces
- verificați cookie-ul de sesiune
- solicitați autentificare dacă este necesar
- trimite
HTTP GET
cerere către adresa URL interceptată inițială
Dar când folosesc reverse-proxy, în loc să trimit HTTP GET
la cererea interceptată, apache trimite HTTP POST
. Aplicația din spatele proxy-ului nu funcționează POST
și imprimă o eroare.
Dacă utilizatorul reîmprospătează pagina, totul funcționează corect deoarece cookie-ul de sesiune este deja setat.
Ce cauzează acest comportament greșit și/sau cum configurez corect această autentificare să funcționeze?