使用 Flask-Login 验证 Nginx 反向代理

Jor*_*ann 1 python nginx flask flask-login nginx-reverse-proxy

我正在实施 Duo Labs 的py_webauthn演示的修改版本,以便向我的网站添加物理身份验证。该演示在 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。)

Jor*_*ann 5

我解决了!可以将内置 Nginxauth_request与 Flask 一起用作身份验证器。简单地说,如果 Flask200在被 Nginx 查询时返回 a ,Nginx 将允许访问另一个页面。或者,401身份验证器可以返回错误以将用户发送到 Nginx 401 页面(在我的情况下,然后将它们重定向到登录页面)。

要复制,请在 Flask 中添加一个验证器:

@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
Run Code Online (Sandbox Code Playgroud)

然后,在 Nginx 中,将 anauth_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;
}
Run Code Online (Sandbox Code Playgroud)

(从Nginx 文档修改的代码