FARM栈应用生产环境Google OAuth2.0 HTTP重定向错误排查
解决方案:FARM栈生产环境Google OAuth2.0 redirect_url_mismatch问题
问题根源
生产环境中FastAPI通常运行在反向代理(如Nginx、AWS ALB)之后,request.url_for()会基于内部HTTP协议生成重定向地址,而非外部用户实际访问的HTTPS地址。这导致Google OAuth验证时收到HTTP格式的redirect_uri,违反了生产模式仅允许HTTPS重定向的规则,从而触发redirect_url_mismatch错误。
修复步骤
1. 手动指定HTTPS重定向地址(快速临时修复)
修改FastAPI的google_cb端点,直接从配置读取预定义的HTTPS API地址,手动拼接正确的redirect_uri,避免依赖url_for生成错误协议的地址:
@router.get('/google_cb') async def login(request: Request): # 从配置中读取已设置的HTTPS API地址(如https://my.api.url) redirect_uri = f"{config['API_URL']}/oauth/google" return await oauth.google.authorize_redirect(request, redirect_uri)
2. 配置FastAPI信任反向代理转发头(推荐长期方案)
让FastAPI识别反向代理传递的外部协议信息,确保url_for()生成正确的HTTPS地址:
步骤a:启动Uvicorn时指定信任的代理IP
生产环境需明确指定允许的代理IP(避免使用*,降低安全风险):
uvicorn main:app --host 0.0.0.0 --port 8000 --forwarded-allow-ips='192.168.1.100' # 替换为你的代理实际IP
步骤b:初始化FastAPI时启用HTTP覆盖信任
from fastapi import FastAPI # 启用信任HTTP覆盖,让FastAPI使用反向代理传递的X-Forwarded-Proto头协议 app = FastAPI(trust_http_overrides=True)
步骤c:配置反向代理传递正确的转发头
以Nginx为例,确保配置中添加以下关键头信息:
location / { proxy_pass http://your-fastapi-internal-address:8000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; # 传递外部访问的实际协议(HTTPS) proxy_set_header X-Forwarded-Host $host; }
3. 验证Google Cloud Console的重定向URI配置
确保已添加的重定向URI与实际生成的地址完全一致:
- 正确格式示例:
https://my.api.url/oauth/google - Google的URI匹配为精确匹配,需检查协议、域名、路径是否无拼写、大小写错误。
额外验证
- 确认生产环境的环境变量
API_URL已设置为HTTPS地址,而非HTTP。 - 可在
google_cb端点临时打印生成的redirect_uri,确认格式正确:print(f"Generated redirect URI: {redirect_uri}")
内容的提问来源于stack exchange,提问作者Kerem Nalbant
相关产品推荐
相关产品推荐

