Open4

【個人開発】FastAPI+vueを使用したToDoアプリの開発で詰まったところ

s_ms_m

親コンポーネントから子コンポーネントへのデータの渡し方

  • 子コンポーネント
const props = defineProps({
  timeToComplete: {
    type: Number,
    required: true,
  },
});
  • 親コンポーネント
<Timer :timeToComplete="timeToComplete" />

参考:
https://mitsutano-oshiro.com/archives/2740

s_ms_m

アクセストークンをHttpOnly Cookieに保存

response.set_cookie(
        key="access_token",
        value=f"Bearer {access_token}",
        httponly=True,
        secure=True,
        domain="localhost", # Cookieをセットするドメイン
        samesite="None", # クロスオリジンで重要
        path="/",
        expires=expires,
    )
def create_access_token(data: dict, expires_delta: timedelta | None = None) -> str:
    to_encode = data.copy()
    if expires_delta:
        expire = datetime.now(timezone.utc) + expires_delta
    else:
        expire = datetime.now(timezone.utc) + timedelta(minutes=15)
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt, expire

アクセトークンをCookieに保存する際、Cookieのexpiresの設定にはUTC datetimeを与える必要があるらしい。

token_type, access_token = get_authorization_scheme_param(authorization)
    if token_type.lower() != "bearer":
        raise credentials_exception

Cookieに保存しているのは、"Bearer {access_token}"なので、このままデコードはできず、上記のようにする必要がある。
また、Cookieを送受信する際は、withCredentials: trueをリクエストに含めなくてはならず、allow_credentials=Trueも設定しなければならない。
参考
https://zenn.dev/noknmgc/articles/fastapi-jwt-cookie
https://www.fastapitutorial.com/blog/fastapi-jwt-httponly-cookie/
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Set-Cookie#属性
https://docs.python.org/ja/3/library/email.utils.html#email.utils.format_datetime
https://docs.python.org/ja/3/library/datetime.html
https://fastapi.tiangolo.com/tutorial/cors/#use-corsmiddleware
https://christina04.hatenablog.com/entry/2016/06/07/123000
https://axios-http.com/ja/docs/req_config
https://zenn.dev/marokanatani/articles/d0777a34641d22#csrf対策

s_ms_m

Cookie周り

response.set_cookie(
        key="access_token",
        value=f"Bearer {access_token}",
        httponly=True,
        secure=False,
        domain="localhost", # Cookieをセットするドメイン
        samesite="None", # クロスオリジンで重要
        path="/",
        expires=expires,
    )

secure=Falseに変更すると、Cookieが送信されない→samesite="None"にはsecure=Trueが必須なので、Cookieが送信されなかった(samesite="Strict"に変更すると送信された)
また、samesite="Strict")でもうまく機能する→フロントエンドとバックエンドのどちらもhttp://localhostでアクセスするから、同ドメインのアプリと認識されている(?)
参考
https://qiita.com/KWS_0901/items/695bd1ecc17a8c2e6d69