muspi_merol / blog / 2023-01-02

最后更新于:2023年3月7日

跨域fetch带上cookies


参见发送带凭据的请求

只有

fetch(url, { credentials: "include" })

时才会在跨域请求中发送cookies(默认是same-site

然而:

当请求使用credentials: 'include'时,响应的Access-Control-Allow-Origin不能使用通配符"*"。在这种情况下,Access-Control-Allow-Origin必须是当前请求的源

所以有了这个PR


但是还需要

SameSite=None需要Secure

  @router.post("/login", responses={404: {}}, response_model=str)
  async def login(data: LoginInput):
      if token := await get_token(data):
          response = PlainTextResponse(token, background=BackgroundTask(
              lambda: UserItem.filter(id=parse_token(token).id).update(last_login_at=timestamp())
          ))
-         response.set_cookie("token", token)
+         response.set_cookie("token", token, secure=True, samesite="none")
      else:
          response = Response(status_code=404)
      return response

最后因为这样的实现太丑陋了还是,还是放弃了这个做法。