秋逸

这个问题搞到了凌晨四点,太气了,网上的都是不完整的!甚至错的! 前后端都要设置,才能完成跨域Cookie!

后端

from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = ['http://127.0.0.1:5173', "http://localhost:5173"]
app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
    max_age = 1,
)

origins必须指定,不能为星号(*)1

allow_credentials必须是True

而且根据约定,我们必须在set-cookie时,把SameSite设置为none2

在fastapi里需要这样:

@router.post("/login")
async def login(*,
        response: Response
):
    response.set_cookie("token", access_token, max_age=age, httponly=True, samesite='none')

注意是字符串none而不是None

但是在这种情况下就只能同时设置secure, 表示只能在Https中使用跨站设置cookie

前端

请求的时候必须把withCredentials 设置为true 例如我使用axios:

import axios from "axios"
axios.defaults.withCredentials = true

为什么还没完!

虽然我们已经按照格式设置完了, 但是我们还是会看到后端设置的cookie被阻止了! 因为SameSite=None的时候, 浏览器不会报错 但是再devTools的网络里看到, cookie没有设置成功, 必须再设置一个Secure, 我说实话你要是没看我这篇文章, 估计要自己要琢磨好久(逃) 但是我们是本地环境, 浏览器里都是127.0.0.1或者localhost, 所以为了开ssl, 还需要安装一个软件 `mkcert : https://github.com/FiloSottile/mkcert/releases 下载地址都给出来了 怎么用就不说了…反正windows就是双击运行 会把证书安装在电脑上, 还会再软件所在的目录下生成两个文件,一个是cert证书文件 一个是private key私钥 接下来我要说fastapi怎么用uvicorn开ssl了, 其他框架的可以退出了()

完结撒花 FastAPI开启HTTPS🌸

# run.py
import uvicorn

if __name__ == "__main__":
    uvicorn.run(
        "app.main:app",
        host='0.0.0.0',
        port=8000, 
        reload=True, 
        ssl_keyfile="./localhost+1-key.pem", 
        ssl_certfile="./localhost+1.pem"
    )

新建一个run.py用来启动服务, 我把mkcert生成的两个文件复制到这里来了, 在最后三行写的就是他们的路径. 当然我们也可以用uvicorn指令启动..

uvicorn app.main:app --port 8011 --host 0.0.0.0 --reload \
    --ssl-keyfile ./privkey.pem \
    --ssl-certfile ./fullchain.pem

这指令你可不能直接用…因为我又给文件换了个名字 反正格式就是这样, 自己改去

Footnotes

  1. https://fastapi.tiangolo.com/tutorial/cors/

FastAPI完成跨域发送Cookie
: 杨秋逸
https://yangqiuyi.com/blog/开发/fastapi完成跨域发送cookie/
© 2025 杨秋逸 . All rights reserved.