В настоящее время я использую nginx в качестве обратного прокси-сервера для нескольких различных веб-серверов в моей сети. До сих пор я просто успешно использовал basic_auth, но хотел улучшить его. Я пытаюсь объединить auth_request и Flask Mega Tutorial для создания портала аутентификации.
У меня есть два flask маршрута, один проверяет, вошел ли пользователь в систему. и возвращает 200 и 401, если нет.
@app.route('/nzb_auth', methods=['GET', 'POST'])
def nzb_auth():
if current_user.is_authenticated:
return Response(status=200)
nginx захватывает 401 и перенаправляет на страницу my / login. Страница входа выполняет аутентификацию, и после успешного завершения возвращает от 200 до nginx.
@app.route('/login', methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
return Response(status=200)
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user is None or not user.check_password(form.password.data):
flash('Invalid username or password')
return redirect(url_for('login'))
login_user(user, remember=form.remember_me.data)
return Response(status=200)
return render_template('login.html', title='Sign In', form=form)
Кажется, это очень близко к работе, но не совсем там. Когда я попал на сайт www.example.com, я вижу, что nginx успешно проходит после / auth, распознает, что я не вошел в систему, и перенаправляет на / login. После успешного входа в систему, я просто выведен на пустую страницу. В соответствии с адресной строкой, я все еще на /login.
Сначала я предположил, что это не работает вообще, но для тестирования я добавил proxy_pass на '/' на одном из моих внутренних сайтов и попробовал еще раз. Все еще не повезло. Но случайно я снова открыл www.example.com в том же Приватном окне, и оно действительно сработало!
Так что кажется, что каждый шаг успешен, я просто никуда не перенаправлюсь, как только начнется auth_request успешный. Какие-либо предложения? Вот мой блок сервера (я удалил этот пропуск прокси).
server {
root /var/www/[SERVER DIRECTORY]/html;
index index.html index.htm index.nginx-debian.html;
server_name [SERVER NAME];
location / {
auth_request /nzb_auth;
error_page 401 = @error401;
}
#If user is logged in, 200 gets returned, otherwise 401
location = /nzb_auth {
internal;
proxy_pass [http://SERVER NAME]/nzb_auth;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
#login route for nzb_auth
location /login {
proxy_pass [http://SERVER NAME]/login;
proxy_set_header X-Original-URI $request_uri;
}
#If not logged in /nzb_auth responds with 401, nginx redirects to /login
location @error401 {
return 302 [http://SERVER NAME]/login;
}
}
return Response(status=401)