通过 Flask-dance 在 Dash 应用 AAD 身份验证中使用 https

问题描述 投票:0回答:1

我正在开发一个基于 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。
  • 设置 Flask 配置参数
    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是不可能的。有什么想法吗?

提前致谢。

flask azure-active-directory plotly-dash flask-dance
1个回答
0
投票

我正要发布本质上相同的问题......这在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 似乎是一个打破了我对烧瓶/蓝图最小理解的结构。

任何指点,建议表示赞赏。

问候 安德鲁

© www.soinside.com 2019 - 2024. All rights reserved.