如何在FastAPI应用中通过fastapi_msal将重定向URI从HTTP改为HTTPS?
FastAPI + Azure AD认证:解决重定向URI HTTP转HTTPS问题
问题背景
用FastAPI搭建Web应用,通过fastapi_msal实现Azure AD认证。登录后系统提示重定向URI以HTTP开头,但Azure要求非本地场景下必须用HTTPS开头。项目代码与ms-identity-python-webapp示例基本一致,已知Flask项目可通过ProxyFix解决该问题,求FastAPI的实现方式。
解决方案
FastAPI基于Starlette(ASGI框架),可通过以下两种方式让应用识别反向代理后的实际HTTPS协议,生成合规的重定向URI:
方法1:使用Starlette原生ForwardedMiddleware
Starlette自带的中间件可处理反向代理传递的头信息,自动识别请求协议:
from fastapi import FastAPI from starlette.middleware.forwarded import ForwardedMiddleware app = FastAPI() # 添加中间件,信任反向代理传递的协议与主机头 # 注意:trusted_hosts建议设置为你的实际域名,而非通配符,避免安全风险 app.add_middleware(ForwardedMiddleware, trusted_hosts=["your-domain.com"])
方法2:适配Werkzeug的ProxyFix
如果偏好Flask的实现思路,可将FastAPI的ASGI应用转为WSGI后使用ProxyFix,再转回ASGI:
from fastapi import FastAPI from werkzeug.middleware.proxy_fix import ProxyFix from asgiref.wsgi import WsgiToAsgi app = FastAPI() # 转换应用类型并应用ProxyFix wsgi_app = WsgiToAsgi(app) app = ProxyFix(wsgi_app, x_proto=1, x_host=1)
必要配置前提
无论使用哪种方法,都需要确保你的反向代理(如Nginx、Azure App Service等)已配置传递以下头信息:
X-Forwarded-Proto:传递实际请求的协议(HTTPS)X-Forwarded-Host:传递实际请求的主机名
以Nginx为例,需在代理配置中添加:
proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host;
完成配置后,fastapi_msal生成的重定向URI会自动使用HTTPS协议,符合Azure的要求。
内容的提问来源于stack exchange,提问作者Tbuff100
相关产品推荐
相关产品推荐

