CORS (跨源资源共享)¶
CORS 或“跨源资源共享”指的是当运行在浏览器中的前端 JavaScript 代码与后端通信,且后端与前端处于不同“源”时的情况。
源 (Origin)¶
源是协议 (http, https)、域名 (myapp.com, localhost, localhost.tiangolo.com) 和端口 (80, 443, 8080) 的组合。
因此,以下都是不同的源:
https://https://https://:8080
即使它们都在 localhost 上,由于使用了不同的协议或端口,它们也被视为不同的“源”。
步骤¶
假设你的前端运行在浏览器的 https://:8080,其 JavaScript 代码尝试与运行在 https:// 的后端通信(因为我们没有指定端口,浏览器会默认假设为端口 80)。
此时,浏览器会向 :80 后端发送一个 HTTP OPTIONS 请求。如果后端发送了适当的响应头,授权来自这个不同源 (https://:8080) 的通信,那么浏览器就会允许前端的 JavaScript 向 :80 后端发送请求。
为了实现这一点,:80 后端必须拥有一个“允许的源”列表。
在这种情况下,该列表必须包含 https://:8080,以便 :8080 前端能够正常工作。
通配符¶
也可以将列表声明为 "*"(“通配符”),表示允许所有源。
但这仅允许特定类型的通信,排除所有涉及凭据的操作:如 Cookie、Bearer Token 等认证请求头等。
因此,为了确保一切正常工作,最好明确指定允许的源。
使用 CORSMiddleware¶
你可以在 FastAPI 应用程序中使用 CORSMiddleware 进行配置。
- 导入
CORSMiddleware。 - 创建一个允许的源列表(作为字符串)。
- 将其作为“中间件”添加到你的 FastAPI 应用程序中。
你还可以指定你的后端是否允许:
- 凭据(认证头、Cookie 等)。
- 特定的 HTTP 方法 (
POST,PUT) 或使用通配符"*"允许所有方法。 - 特定的 HTTP 请求头或使用通配符
"*"允许所有请求头。
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"https://.tiangolo.com",
"https://.tiangolo.com",
"https://",
"https://:8080",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def main():
return {"message": "Hello World"}
CORSMiddleware 实现默认的参数是受限的,因此你需要显式启用特定的源、方法或头,浏览器才能在跨域上下文中使用它们。
支持以下参数:
allow_origins- 允许进行跨源请求的源列表。例如:['https://example.org', 'https://www.example.org']。你可以使用['*']来允许任何源。allow_origin_regex- 用于匹配允许跨源请求的源的正则表达式字符串。例如:'https://.*\.example\.org'。allow_methods- 允许跨源请求的 HTTP 方法列表。默认为['GET']。你可以使用['*']来允许所有标准方法。allow_headers- 支持跨源请求的 HTTP 请求头列表。默认为[]。你可以使用['*']来允许所有请求头。Accept,Accept-Language,Content-Language和Content-Type头始终允许用于 简单 CORS 请求。-
allow_credentials- 指示是否支持跨源请求的 Cookie。默认为False。如果
allow_credentials设置为True,则allow_origins、allow_methods和allow_headers均不能设置为['*']。所有这些都必须 明确指定。 -
expose_headers- 指示浏览器可以访问的任何响应头。默认为[]。 max_age- 设置浏览器缓存 CORS 响应的最长时间(以秒为单位)。默认为600。
该中间件响应两种特定的 HTTP 请求类型……
CORS 预检请求¶
这是任何带有 Origin 和 Access-Control-Request-Method 头的 OPTIONS 请求。
在这种情况下,中间件将拦截传入的请求,并以适当的 CORS 响应头进行响应,并返回 200 或 400 状态码以供参考。
简单请求¶
任何带有 Origin 头的请求。在这种情况下,中间件将正常通过请求,但会在响应中包含适当的 CORS 头。
更多信息¶
关于 CORS 的更多信息,请查看 Mozilla CORS 文档。
技术细节
你也可以使用 from starlette.middleware.cors import CORSMiddleware。
FastAPI 在 fastapi.middleware 中提供了几个中间件,纯粹是为了方便开发者使用。但大多数可用的中间件直接来自 Starlette。