如何在GAE标准环境中实现类似Nginx proxy_pass的代理功能?
在Flask(Python 3)中实现Firebase Auth反向代理(适配GAE)
可以实现,通过Flask路由结合requests库,就能把/__/auth路径的请求转发到Firebase Auth服务,达到和Nginx反向代理相同的效果,解决Safari第三方Cookie拦截问题。
实现步骤:
- 添加依赖
在项目的requirements.txt中加入所需库:
requests>=2.31.0 Flask>=2.0.0
- 编写代理路由
在Flask应用中添加以下代码,替换你的Firebase项目ID:
from flask import Flask, request, Response import requests app = Flask(__name__) # 替换为你的Firebase项目ID FIREBASE_PROJECT_ID = "your-project-id" FIREBASE_AUTH_PROXY_URL = f"https://{FIREBASE_PROJECT_ID}.firebaseapp.com/__/auth" # 处理/__/auth下的所有子路径请求 @app.route("/__/auth/<path:subpath>", methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"]) @app.route("/__/auth", methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"]) def proxy_firebase_auth(subpath=""): # 拼接目标URL target_url = f"{FIREBASE_AUTH_PROXY_URL}/{subpath}" if subpath else FIREBASE_AUTH_PROXY_URL # 转发请求头(排除Host,避免目标服务器识别异常) forward_headers = {k: v for k, v in request.headers.items() if k.lower() != "host"} # 处理CORS预检请求 if request.method == "OPTIONS": resp = Response() # 建议替换为你的前端域名,限制跨域范围 resp.headers["Access-Control-Allow-Origin"] = "*" resp.headers["Access-Control-Allow-Methods"] = "GET, POST, PUT, DELETE, OPTIONS" resp.headers["Access-Control-Allow-Headers"] = "Content-Type, Authorization" return resp # 根据请求方法转发请求 if request.method == "GET": firebase_resp = requests.get(target_url, headers=forward_headers, params=request.args) elif request.method == "POST": firebase_resp = requests.post(target_url, headers=forward_headers, data=request.get_data(), params=request.args) elif request.method == "PUT": firebase_resp = requests.put(target_url, headers=forward_headers, data=request.get_data(), params=request.args) elif request.method == "DELETE": firebase_resp = requests.delete(target_url, headers=forward_headers, params=request.args) else: return Response(status=405) # 构建响应,转发状态码、内容和响应头 proxy_resp = Response(firebase_resp.content, status=firebase_resp.status_code) for k, v in firebase_resp.headers.items(): # 跳过自动处理的头,避免冲突 if k.lower() not in ["content-length", "transfer-encoding"]: proxy_resp.headers[k] = v # 确保CORS头存在 proxy_resp.headers["Access-Control-Allow-Origin"] = "*" # 按需替换为具体域名 return proxy_resp if __name__ == "__main__": app.run(debug=True)
关键注意事项:
- 替换项目ID:把
your-project-id换成你实际的Firebase项目ID - CORS配置:生产环境不要用
*,改为你的前端域名(比如https://your-app-domain.com),提升安全性 - GAE部署:部署时GAE会自动读取
requirements.txt安装依赖,无需额外配置 - 测试验证:在Safari中测试登录流程,确认Auth请求通过同域名代理后,第三方Cookie不再被拦截
内容的提问来源于stack exchange,提问作者minou
相关产品推荐
相关产品推荐

