Я работаю над модулем nginx auth_request, чтобы поставить слой аутентификации на все входящие запросы на мой сервер.Цель состоит в том, чтобы сначала передавать каждый URL-запрос на страницу входа, проверять авторизацию, а затем перенаправлять на конкретную страницу, упомянутую для этого URL-адреса.Для аутентификации я использую простое приложение с фляжкой, которое при успешном завершении возвращает 200, а при ошибке 401.
Проблема, с которой я сталкиваюсь, заключается в том, что при успешной аутентификации nginx выдает ошибку 404 вместо перенаправления на упомянутыйurl.
server {
listen 8080;
server_name _;
location /url_1 {
auth_request /auth_pass;
error_page 401 = @error401;
auth_request_set $user $upstream_http_x_user;
auth_request_set $auth_status $upstream_status;
proxy_set_header x-user $user;
#the aim here is to redirect to google.com on successful authentication.
proxy_pass http://www.google.com;
}
location = /auth_pass {
internal;
proxy_pass http://flask_app_server_address/login;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
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;
}
#error_page 401 = @error401;
location @error401{
return 302 http://flask_app_server_address/login?url=$request_uri;}
}
Кроме того, вот функция входа в приложение фляги, которую я написал.
def login():
if request.method=="GET":
redirect_url=request.args.get('url')
if flask_login.current_user.is_authenticated:
return app.response_class(status=200)
print "failed is_authenticated check"
return render_template('login.html',redirect_url=redirect_url),401
else:
data= request.form
username=data['username']
password=data['password']
redirect_url=data['requestParam']
user=User.query.filter_by(login=username).first()
if user is None or not (check_password_hash(user.password,password) or (user.password==password)):
print "failed to login"
return redirect('http://server_ip'+redirect_url),401
flask_login.login_user(user)
return redirect('http://server_ip'+redirect_url),302