auth_request + php-fpm + POST request

Arno0x0x nginx-forum at nginx.us
Sat Apr 11 13:21:30 UTC 2015


Hi,

I'm using the auth_request module to enable custom (2fa) authentication to
protect my whole website, no matter the various applications I host on this
website. So the auth_request directive is set at the "server" level.

The authentication subrequest works fine, except for client POST requests
where the php auth script holds forever until I get a timeout in the nginx
error.log :
"*1 upstream timed out (110: Connection timed out) while reading response
header from upstream"

It took me a while guessing why, but my guess is, from the debug trace I
created, that the PHP script sees both a "content-length" and "content-type"
in the HTTP headers, but the request body is not being sent to the auth
scripts (there's no need anyway, all I need is the cookies).

I had to trick the config to make it work, and that's what I'm sharing here,
but I'd like to know if there's a more "standard" way to deal with this.

My nginx.conf file is standard, and here is the bits from my
"sites-available" config file:
-----------------------------------------------------------------------------------------
server {
	listen   443;
	server_name www.example.eu;

	ssl on;
	ssl_certificate /etc/nginx/ssl/www.exemple.eu.crt;
	ssl_certificate_key /etc/nginx/ssl/www.exemple.eu.key;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_ciphers 'AES256+EECDH:AES256+EDH';
	ssl_prefer_server_ciphers on;
	ssl_session_cache shared:SSL:10m;
	
	root var/www/exemple.eu;
	index index.php index.html index.htm;

	auth_request /twofactorauth/auth/auth.php;

 	error_page 401 = @error401;
	
	location @error401 {
        	return 302 $scheme://$host/twofactorauth/login/login.html;
	}

	location / {
		try_files $uri $uri/ /index.html;
	}

	location ~ \.php$ {
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi.conf;
	}

	location = /twofactorauth/auth/auth.php {
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		include fastcgi.conf;
		fastcgi_param REQUEST_METHOD "GET"; 
    }

	location /twofactorauth/login/ {
		auth_request off;
        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi.conf;
        }
	}
}
-----------------------------------------------------------------------------------------

See the trick ? The auth.php script is being forced a "GET" method even when
the client used a POST request.

By the way, I didn't manage to get the whole auth_request config working
using all the "proxy_pass" stuff. So I used a straight call to the auth.php
script.

Any ideas are welcomed.
Cheers
Arno0x0x

Posted at Nginx Forum: http://forum.nginx.org/read.php?2,257968,257968#msg-257968



More information about the nginx mailing list