Использование Flask-Login для аутентификации обратного прокси-сервера Nginx - PullRequest
0 голосов
/ 17 апреля 2019

Я внедряю модифицированную версию демо py_webauthn Duo Labs, чтобы добавить физическую аутентификацию на мой сайт.Демонстрация построена на Flask и использует библиотеку flask-login в сочетании с базой данных SQLAlchemy для хранения пользовательских данных.

В идеале мне бы хотелось, чтобы приложение Flask действовало как аутентификатор Nginx, так чтовошедший в систему пользователь может получить доступ к другим proxy_pass 'ed службам на сервере.

Первоначально я пытался реализовать обратные прокси-серверы во Flask, но единственное найденное рабочее решение требует инфраструктуры Twisted(поскольку такие сервисы, как Shellinabox, требуют постоянных запросов), для которых необходимо установить совершенно отдельное приложение WSGI - ненужный посредник, который трудно интегрировать.

Мой идеальный результат - для пользователя получить первоначальный доступсервер и будет proxy-pass 'подключен к серверу аутентификации Flask, затем сможет получить доступ к нескольким другим службам обратного прокси через Nginx.Я все еще открыт для обратного прокси-сервера Python, но обнаружил, что Nginx наилучшим образом соответствует моим потребностям.

Как мне интегрировать Flask и Nginx?

(файл app.py длядемонстрационная библиотека доступна здесь . Функциональность Webauthn просто построена поверх flask-login.)

1 Ответ

0 голосов
/ 18 апреля 2019

Я решил это! Можно использовать встроенный Nginx auth_request с Flask в качестве аутентификатора. Проще говоря, если Flask возвращает 200 по запросу Nginx, Nginx разрешит доступ к другой странице. В качестве альтернативы, аутентификатор может вернуть ошибку 401, чтобы отправить пользователя на страницу Nginx 401 (которая, в моем случае, затем перенаправляет его на страницу входа).

Чтобы скопировать, добавьте аутентификатор во фляге:

@app.route("/auth")
def nginx_auth():
    if current_user.is_authenticated:
        return "You are logged in! Sweet!"
    else:
        return 'Sorry, but unfortunately you\'re not logged in.', 401

Затем в Nginx укажите auth_request для аутентификатора и перенаправьте 401 на страницу входа.

location /ssh {
   auth_request /auth;
   proxy_pass http://localhost:4200/;
}

location = /auth {
    internal;
    proxy_pass              https://localhost:8081/auth;
    proxy_pass_request_body off;
    proxy_set_header        Content-Length "";
    proxy_set_header        X-Original-URI $request_uri;
}

error_page 401 = @error401;
location @error401 {
    return 302 /login;
}

(Код изменен из документации Nginx. )

...