首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Flask-Login验证Nginx反向代理

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

Stack Overflow用户
提问于 2019-04-17 11:58:39
回答 2查看 3K关注 0票数 1

我正在实现Duo Labs的py_webauthn演示的修改版本,以便为我的网站添加物理身份验证。该演示是在Flask中构建的,并结合使用flask-login库和SQLAlchemy数据库来存储用户数据。

理想情况下,我希望Flask应用程序充当Nginx验证器,这样登录的用户就能够访问服务器上的其他proxy_pass服务。

我最初试图在Flask中实现反向代理,但我找到的唯一有效的解决方案需要Twisted框架(因为像Shellinabox这样的服务需要不断发出请求),它需要一个完全独立的WSGI应用程序来设置-这是一个不必要的中间人,很难集成。

我的理想结果是让用户最初访问服务器,并被proxy-pass'ed到Flask认证服务器,然后就可以通过Nginx访问其他几个反向代理服务。

我应该如何集成Flask和Nginx?

(演示库的app.py文件可以在here中找到。Webauthn功能只是构建在flask-login之上。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-18 06:55:13

我解决了!可以使用内置的Nginx auth_request和Flask作为验证器。简单地说,如果Flask在被Nginx查询时返回一个200,那么Nginx将允许访问另一个页面。或者,身份验证器可以返回一个错误401,将用户发送到Nginx401页面(在我的例子中,Nginx401页面会将用户重定向到登录页面)。

要复制,请在Flask中添加身份验证器:

代码语言:javascript
复制
@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重定向到登录页面。

代码语言:javascript
复制
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 documentation.)

票数 5
EN

Stack Overflow用户

发布于 2021-01-30 22:26:50

我遇到了同样的问题(当我重定向时,在我的flask应用程序结果404中进行了身份验证),并来到这里寻找答案。我的解决方案最终变得更简单了。

nginx.conf中,我将proxy_set_header Host $host;设置为proxy_set_header Host $http_host;。我仍然在弄清楚它为什么会起作用。如果我这样做了,我会更新答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55719659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档