跳至內容

CORS(跨來源資源共用)

CORS 或「跨來源資源共用」是指前端在瀏覽器中運行,其 JavaScript 程式碼與後端通訊,而後端與前端位於不同「來源」的情況。

來源

來源是通訊協定 (httphttps)、網域 (myapp.comlocalhostlocalhost.tiangolo.com) 和連接埠 (804438080) 的組合。

因此,以下所有都是不同的來源

  • http://localhost
  • https://localhost
  • http://localhost:8080

即使它們都在 localhost 上,但它們使用不同的通訊協定或連接埠,因此它們是不同的「來源」。

步驟

假設您的前端在瀏覽器中以 http://localhost:8080 運行,並且其 JavaScript 正嘗試與在 http://localhost 運行的後端通訊(因為我們沒有指定連接埠,瀏覽器會假設預設連接埠為 80)。

然後,瀏覽器會向 :80 後端發送 HTTP OPTIONS 請求,如果後端發送授權來自此不同來源 (http://localhost:8080) 的通訊的適當標頭,則 :8080 瀏覽器將允許前端中的 JavaScript 向 :80 後端發送其請求。

為達成此目的,:80 後端必須具備「允許的來源」清單。

在這種情況下,清單必須包含 http://localhost:8080 才能使 :8080 前端正常運作。

萬用字元

也可以將清單宣告為 "*"(「萬用字元」)以表示允許所有來源。

但這只會允許某些類型的通訊,排除所有涉及憑證的通訊:Cookie、與 Bearer 權杖一起使用的授權標頭等。

因此,為了讓一切正常運作,最好明確指定允許的來源。

使用 CORSMiddleware

您可以使用 CORSMiddleware 在您的 FastAPI 應用程式中進行設定。

  • 匯入 CORSMiddleware
  • 建立允許來源的清單(以字串形式)。
  • 將其作為「中介軟體」新增至您的 FastAPI 應用程式。

您也可以指定您的後端是否允許

  • 憑證(授權標頭、Cookie 等)。
  • 特定的 HTTP 方法 (POSTPUT) 或使用萬用字元 "*" 允許所有方法。
  • 特定的 HTTP 標頭或使用萬用字元 "*" 允許所有標頭。
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
    "http://localhost.tiangolo.com",
    "https://localhost.tiangolo.com",
    "http://localhost",
    "http://localhost: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 請求標頭列表。預設為 []。您可以使用 ['*'] 允許所有標頭。對於簡單的 CORS 請求,始終允許 AcceptAccept-LanguageContent-LanguageContent-Type 標頭。
  • allow_credentials - 指示是否允許跨域請求攜帶 Cookie。預設為 False。此外,若要允許憑證,allow_origins 不能設定為 ['*'],必須指定來源。
  • expose_headers - 指示瀏覽器可以訪問的任何響應標頭。預設為 []
  • max_age - 設定瀏覽器快取 CORS 響應的最長時間(以秒為單位)。預設為 600

中間件會回應兩種特定類型的 HTTP 請求...

CORS 預檢請求

這些是任何帶有 OriginAccess-Control-Request-Method 標頭的 OPTIONS 請求。

在這種情況下,中間件會攔截傳入的請求,並使用適當的 CORS 標頭進行響應,並以 200400 響應來提供資訊。

簡單請求

任何帶有 Origin 標頭的請求。在這種情況下,中間件會照常傳遞請求,但會在響應中包含適當的 CORS 標頭。

更多資訊

有關 CORS 的更多資訊,請查看 Mozilla CORS 文件

「技術細節」

您也可以使用 from starlette.middleware.cors import CORSMiddleware

FastAPIfastapi.middleware 中提供多個中間件,方便開發人員使用。但大多數可用的中間件都直接來自 Starlette。