我正在实现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之上。)
发布于 2019-04-18 06:55:13
我解决了!可以使用内置的Nginx auth_request和Flask作为验证器。简单地说,如果Flask在被Nginx查询时返回一个200,那么Nginx将允许访问另一个页面。或者,身份验证器可以返回一个错误401,将用户发送到Nginx401页面(在我的例子中,Nginx401页面会将用户重定向到登录页面)。
要复制,请在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然后,在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 documentation.)
发布于 2021-01-30 22:26:50
我遇到了同样的问题(当我重定向时,在我的flask应用程序结果404中进行了身份验证),并来到这里寻找答案。我的解决方案最终变得更简单了。
在nginx.conf中,我将proxy_set_header Host $host;设置为proxy_set_header Host $http_host;。我仍然在弄清楚它为什么会起作用。如果我这样做了,我会更新答案。
https://stackoverflow.com/questions/55719659
复制相似问题