如何使用证书和MSAL保护Flask应用 解决Azure AD回调URL协议错误
问题解决方法
问题根源为Nginx反向代理与后端uWSGI/Flask服务间走HTTP协议,Flask默认会以本地收到的请求协议生成回调地址,导致发送到Azure的redirect_uri为HTTP格式,和Azure后台配置的HTTPS回调地址不匹配,按以下步骤逐一配置即可修复:
第一步:配置Nginx反向代理透传协议和域名信息
打开你站点的Nginx配置文件,在处理Flask请求的location块中补充以下请求头配置,将外部真实的请求协议、域名信息传递给后端服务:location / { include uwsgi_params; uwsgi_pass unix:/path/to/your/uwsgi.sock; # 替换为你实际的uwsgi套接字路径 # 新增以下配置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; uwsgi_param HTTP_X_FORWARDED_PROTO $scheme; }配置保存后执行
nginx -s reload重载配置。第二步:配置Flask信任代理头
安装ProxyFix中间件处理反向代理透传的头信息,在你的Flask启动文件中添加以下代码:from werkzeug.middleware.proxy_fix import ProxyFix # 你的原有app初始化代码 app = Flask(__name__) # 新增ProxyFix配置,x_proto=1代表信任1层反向代理传递的协议头 app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)配置完成后重启uWSGI服务。
第三步(可选,兜底方案):手动指定redirect_uri
如果前两步配置后仍有问题,可直接在调用MSAL生成认证链接的代码中硬编码回调地址,不需要自动生成:
找到你生成登录跳转链接的代码,将原来的自动生成回调地址的逻辑替换为你在Azure后台配置的HTTPS地址即可,示例:# 原来的自动生成逻辑(可能是这样) # redirect_uri = url_for("getAtoken", _external=True) # 替换为硬编码的HTTPS回调地址 redirect_uri = "https://<你的服务器地址>/getAtoken" # 后续构造auth url的逻辑不变 auth_url = msal_app.get_authorization_request_url( scopes=..., redirect_uri=redirect_uri )
配置全部完成后清理浏览器缓存,重新触发登录流程即可解决AADSTS50011报错。
内容的提问来源于stack exchange,提问作者itinneed
相关产品推荐
相关产品推荐

