Nginx не перенаправляет на URL при успешной аутентификации - PullRequest
0 голосов
/ 31 января 2019

Я работаю над модулем 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
...