You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GAE标准环境中实现类似Nginx proxy_pass的代理功能?

在Flask(Python 3)中实现Firebase Auth反向代理(适配GAE)

可以实现,通过Flask路由结合requests库,就能把/__/auth路径的请求转发到Firebase Auth服务,达到和Nginx反向代理相同的效果,解决Safari第三方Cookie拦截问题。

实现步骤:

  1. 添加依赖
    在项目的requirements.txt中加入所需库:
requests>=2.31.0
Flask>=2.0.0
  1. 编写代理路由
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:10:41