Python中Firebase Functions配置CORS的问题求助
问题
我在Python版Firebase Functions中尝试用官方方式配置CORS:
from firebase_functions.options import CorsOptions from firebase_functions import https_fn @https_fn.on_request(cors=CorsOptions(cors_origins=['*'], cors_methods=['POST'])) def my_function(req: https_fn.Request) -> https_fn.Response: pass
但碰到两个问题:
- 没法设置
Access-Control-Allow-Headers响应头; - 明明配置了
cors_methods=['POST'],返回的响应头里却没有Access-Control-Allow-Methods=POST。
目前我用自定义装饰器处理CORS(代码如下),但更倾向于用官方方案解决:
from typing import Callable, Union import functools from firebase_functions import https_fn def handle_cors(fn: Callable, allowed_origins: Union[list[str], None] = None, allowed_methods: Union[list[str], None] = None) -> Callable: if allowed_origins is None: allowed_origins = ['*'] if allowed_methods is None: allowed_methods = ['POST'] @functools.wraps(fn) # 保留原函数的名称、文档字符串等 def wrapper(req: https_fn.Request): if req.method == 'OPTIONS': return https_fn.Response(status=204, headers={ 'Access-Control-Allow-Origin': ', '.join(allowed_origins), 'Access-Control-Allow-Methods': ', '.join(allowed_methods), 'Access-Control-Allow-Headers': 'Content-Type, Authorization', 'Access-Control-Max-Age': '3600'}) return fn(req) return wrapper
解决方案
1. 设置Access-Control-Allow-Headers响应头
Python版Firebase Functions的CorsOptions类提供了cors_headers参数,直接在配置中指定允许的请求头即可:
from firebase_functions.options import CorsOptions from firebase_functions import https_fn @https_fn.on_request( cors=CorsOptions( cors_origins=['*'], cors_methods=['POST'], cors_headers=['Content-Type', 'Authorization'] # 配置允许的请求头 ) ) def my_function(req: https_fn.Request) -> https_fn.Response: # 业务逻辑处理 return https_fn.Response("请求处理完成", status=200)
2. 解决Access-Control-Allow-Methods不显示的问题
官方CorsOptions配置的cors_methods会自动在OPTIONS预检请求的响应中返回Access-Control-Allow-Methods头——这符合CORS规范,因为该头仅需在预检响应中出现,常规POST请求的响应里不需要包含。
如果业务需求要求在常规响应中也带上这个头,可以在函数返回的Response里手动添加:
from firebase_functions.options import CorsOptions from firebase_functions import https_fn @https_fn.on_request( cors=CorsOptions( cors_origins=['*'], cors_methods=['POST'], cors_headers=['Content-Type', 'Authorization'] ) ) def my_function(req: https_fn.Request) -> https_fn.Response: response_headers = { 'Access-Control-Allow-Methods': 'POST' # 可添加其他自定义响应头 } return https_fn.Response("请求处理完成", status=200, headers=response_headers)
额外提示
官方CorsOptions会自动处理OPTIONS预检请求,无需手动编写逻辑。如果配置后仍有异常,检查Firebase Functions SDK是否为最新版本,旧版本可能不支持部分参数。
内容的提问来源于stack exchange,提问作者João Abrantes
相关产品推荐
相关产品推荐

