我正在开发一个基于 Flask 的 Dash 应用程序,它通过
flask-dance
与 Azure AD 集成。我遵循了本教程:https://dev.to/kummerer94/aad-auth-for-plotly-dash-3m57。虽然它在开发环境中运行良好,但在生产部署中它会重定向到错误的 URI,因为它使用 http 而不是 https。
这是我的代码:它是一个最小的 Dash 应用程序。
from dash import Dash, html
from werkzeug.middleware.proxy_fix import ProxyFix
from flask import Flask, redirect, url_for, session
from flask_dance.contrib.azure import azure, make_azure_blueprint
from dotenv import load_dotenv
load_dotenv()
def login_required(func):
"""Require a login for the given view function."""
def check_authorization(*args, **kwargs):
if not azure.authorized or azure.token.get("expires_in") < 0:
return redirect(url_for("azure.login"))
else:
return func(*args, **kwargs)
return check_authorization
blueprint = make_azure_blueprint(
client_id="my client id",
client_secret="my client secret",
tenant="my tenant id",
scope=["openid", "email", "profile"],
login_url="/login",
authorized_url="/auth",
prompt="none"
)
server = Flask(__name__)
server.config["SECRET_KEY"] = "secret key"
server.register_blueprint(blueprint, url_prefix="/login")
app = Dash(__name__, server=server)
server.wsgi_app = ProxyFix(server.wsgi_app, x_proto=1, x_host=1, x_for=1, x_prefix=1, x_port=1)
for view_func in server.view_functions:
if not view_func.startswith("azure"):
server.view_functions[view_func] = login_required(server.view_functions[view_func])
app.layout = html.Div(children=[
html.H1(children='Azure AD test'),
html.Div(children="You are logged in!")
])
if __name__ == '__main__':
app.run(debug=True)
生产部署是通过 Microsoft IIS 和
wfastcgi
完成的。重定向到 Microsoft 登录站点后,收到以下错误:
“...请求中指定的重定向 URI 'http://example.com/login/auth' 与为应用程序 '我的客户端 id' 配置的重定向 URI 不匹配”
问题是 Azure AD 中指定的重定向 URI 有 https 而不是 http。这是我到目前为止所尝试过的:
ProxyFix
(werkzeug.middleware.proxy_fix
),将 x_proto
、x_for
等设置为 1。APPLICATION_ROOT="\"
和 PREFERRED_URL_SCHEME="https"
。OAUTHLIB_INSECURE_TRANSPORT=0
(实际上这是用load_dotenv()
加载的.env文件的内容)。如果设置为 1,如Flask-Dance 和错误:redirect_uri_mismatch 中的建议,则会弹出相同的错误。debug
参数更改为 False。flask-talisman
来使用Talisman(server)
。返回“连接被拒绝错误”。设置 content_security_policy=None
没有效果。这些似乎都不起作用,因为 Flask 构建的重定向 URI 仍然是错误的(http 而不是 https)。需要指出的是,使用http是不可能的。有什么想法吗?
提前致谢。
我正要发布本质上相同的问题......这在AWS上......(见下文)这很奇怪,因为我的环境是我之前成功使用过两次的环境的副本。
嗨
我有一个配置在过去(其他环境)中有效,但现在对我来说行为不当。
我正在 AWS ALB 后面运行一个 ec2,其中 ALB 在 ec2 上映射 443 到 80,然后由 docker 容器中的 nginx 拾取,并使用 Flask-dance 路由到运行 oauth 的 python Flask 应用程序到 azure...我已将应用程序包装在 werkzeug proxyfix 中。
app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_host=1)
我的问题是,尽管 nginx 配置看起来像这样:
upstream webapp {
server amalfinationv2:5005;
}
server {
listen 5085;
server_name localhost;
location / {
proxy_pass http://webapp;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_buffers 8 16k;
proxy_buffer_size 32k; }
}
这似乎适用于标准调用,即在 Flask 中重定向,但在 Flask-dance 情况下,它不是重定向,而是传递给微软调用的参数。
我对 azure 蓝图的调用不断在对 microsoft auth 的调用中设置redirect_uri 参数以使用 http 而不是 https。我尝试通过构建如下所示的蓝图来强制解决该问题...
azure_blueprint = make_azure_blueprint(
client_id=utils_instance.get_secret("AZURE_ID"),
client_secret=utils_instance.get_secret("AZURE_SECRET"),
redirect_url="https://v2.amalfination.com/login/azure/authorized",
)
但这似乎对调用中的redirect_uri参数没有影响。
我强烈怀疑这是漫长道路上某个地方的奇怪设置,但我很难找到它。
我的问题是,如果(默认情况下,通常对我有用)没有传递redirect_url,azure_blueprint似乎会自己构建该值 - 我如何找到发生这种情况的位置,以便我可以进一步调试问题的根源(自然变得更困难,因为它只在 AWS 环境中展示)。最糟糕的情况是,我可以在其中注入一些老式的打印语句,看看是否能找到罪魁祸首。
azure_blueprint 似乎是一个打破了我对烧瓶/蓝图最小理解的结构。
任何指点,建议表示赞赏。
问候 安德鲁