# 跨域fetch带上cookies (February 2, 2023)

参见[发送带凭据的请求](https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch#%E5%8F%91%E9%80%81%E5%B8%A6%E5%87%AD%E6%8D%AE%E7%9A%84%E8%AF%B7%E6%B1%82)

只有

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

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

然而：

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

所以有了[这个PR](https://github.com/re-bingo/re-bingo/commit/8dc3e7bb6dcf30142cac073f4f3767f22f1ce909)

---

但是还需要

> [SameSite=None需要Secure](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie/SameSite#samesitenone_%E9%9C%80%E8%A6%81_secure)
>

```diff
  @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
```

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