kachuno9
@kachuno9

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ReactでCookieの削除の方法を教えてください!!

解決したいこと

バックエンドにDjango REST Framework、フロントエンドにReactを用いてWebアプリケーションを作成しています。DRFはAPIとして使用しています。

現在困っていることは、JWTを用いた会員ログアウト機能の実装で、React側でのトークンの削除方法が分かりません。トークンはcookieに保存しています。

<できていること>
・カスタムユーザーモデルの作成(email,passwordで認証)
・DRF側でsimple-jwtを用いて、アクセストークン及びリフレッシュトークンの表示
(エンドポイント: http://localhost:8000/api/v1/auth/jwt/create)

・React側でAPIエンドポイントからのデータの取得・認証処理
①Formでユーザーに入力してもらったemail、passwordを http://localhost:8000/api/v1/auth/jwt/create に送信し、トークンを取得
②取得したトークンをヘッダーにセットしてAPIに接続

<解決したいこと>
・React側でログアウト機能を実装したいのですが、cookieの削除が上手くいかないので解決したいです。

<開発環境>
MacOS BigSur -- 11.2.1

発生している問題・エラー

Logoutページを用意してログアウトボタンを押すとcookieを削除し、ホームページに遷移するような実装をしたのですが、cookieが削除されません。

該当するソースコード

[React]Logout.js
import React from 'react';
import { useCookies } from 'react-cookie';
import  { useHistory } from 'react-router-dom';

const Logout = (props) => {
  const history = useHistory();
  const [cookies, removeCookie] = useCookies();

  const RemoveJwt = () => {
    removeCookie('accesstoken', { path: '/' }, { httpOnly: true });
    removeCookie('refreshtoken', { path: '/' }, { httpOnly: true });
    history.push('/');
    console.log("ログアウトしました")
    console.log(cookies);
  }

    return (
        <div>
          <button onClick={RemoveJwt}>ログアウト</button>
        </div>
    );
  }

  export default Logout;

自分で試したこと

  • いろいろな方法を調べたのですが、最終的にReact HookのuseCookiesというものでクッキーを扱えると知り、そちらで実装しました。
  • コンソールログで確認を行ったのですが、上記のコードでボタンを押すと、"ログアウトしました"というコメントとcookieの中身が表示されてしまいました。スクリーンショット 2021-04-09 23.40.58.png

再び前回と同じ様な質問で大変恐縮なのですが、どなたか改善策を教えていただけないでしょうか?
よろしくお願いいたします。

0

1Answer

const [cookies, removeCookie] = useCookies();

ここで useCookies() は3要素の配列 [クッキーオブジェクト, クッキーをセットする関数, クッキーを削除する関数] を返します。これを const [cookies, removeCookie] で受けると removeCookie 変数にクッキーをセットする関数が代入されてしまい意図通りに動きません。セットする関数が必要なくても

const [cookies, setCookie, removeCookie] = useCookies();

としてください。

それを直したとしてもう一つ問題があります。 removeCookie('accesstoken', { path: '/' }, { httpOnly: true }); は実際にブラウザから accesstoken クッキーを削除しますが、 cookies 変数には反映されないので消えていないように見えます。

ご質問のコードで言えば、 cookies 変数の値は useCookies() を呼んだ瞬間のクッキーの状態を表し、 Logout コンポーネントを return で抜けるまでそのままです。 DOM が更新されて Logout コンポーネントがもう一度レンダリングされると、 cookies は最新の状態(accesstoken クッキーが消えた状態)になります。

1Like

Comments

  1. @kachuno9

    Questioner

    @uasi様
    ご回答ありがとうございます!!

    教えていただいた通り、useCookiesの宣言部を変更すると上手くログアウトできました。
    また、cookies変数の反映についても勘違いしていました。。本当に助かりました。

    何度もご丁寧に教えてくださり、本当にありがとうございます!!!

Your answer might help someone💌