Blog

Laravel のremember_token

Laravel のremember_token

私が Laravel プロジェクトを作成して、
システム開発を行っていたときに困ったことです。

今回は、ブラウザテストを行っていた時に、
「とんでもないバグに出会ってしまったんじゃないか・・・。」
と、感じたものをまとめています。

ユーザの削除

私が実装しようとしていたのは、ユーザの退会処理でした。
退会の確認画面で、退会する選択をしたら、

  • ユーザの持っているItemの削除
  • ユーザに関するデータの削除
  • ユーザのログアウト

の 3 つの処理が必要だと考え、以下のコードを記述しました。

UserController.php

public function destroy () {
    $user = Auth::user();

    $user->items()->delete();
    $user->delete();
    Auth::logout();

    return redirect("/");
}

これで問題なく動く・・・はずでした。

remember_token

いざ、テストを回してみると、
特定の条件でユーザが削除できないことに気付きました。

それは、
ログイン時にログイン状態を保持させることでした。

Laravel デフォルトのユーザ認証を実装すると、
ログイン状態を保持するremember_tokenがあります。

コイツが悪さをしていたのです。

ログイン状態を保持させたときの動作

色々調べてみました。

どうやら、ログイン情報を保持させると
remember_tokenが発行されて、sessionに保持されるようです。

そして、ログアウトの処理時に、
ユーザのremember_tokenupdate処理により更新されます。

ここまでは、「そうなのか」で済む動作ですね。

ユーザが復活!?

さて、上記のコードをテストしたと言いました。
そして、ユーザが削除できないとも言いました。
しかし、それは正しい動作の説明ではありません。

実は、しっかりとユーザの情報は削除されています。

しかし、ログアウト処理を行った際に
insert処理が行われているのです。

どうやら、
remember_tokensessionで保持したユーザが見つからなかったとき
insertするようにデフォルトで組み込まれているようです。

つまり、削除して追加していたため
結果として、削除できてないとなった訳です。

UserController.php

public function destroy () {
    $user = Auth::user();

    $user->items()->delete(); // Itemが削除される。
    $user->delete(); // ユーザが削除される。
    Auth::logout(); // ユーザが追加されてしまう。

    return redirect("/");
}
解決

まぁ、もしかしたらコードを見てすぐに
順番がおかしいことに気付いた方もいらっしゃると思います。

まだまだ素人なため、動作の順番を誤っていました。

ブラウザで動作を確認しながら記述していた際に、
ログアウト処理を忘れており、migrate:freshしたときにログイン状態が保持されていることで
ログアウト処理を追加したのが原因でした。

ということで、正しいコードは以下のとおりです。

UserController.php

public function destroy () {
    $user = Auth::user();

    Auth::logout(); // ログアウト、update処理が行われる。
    $user->items()->delete(); // Itemが削除される。
    $user->delete(); // ユーザが削除される。

    return redirect("/");
}

よく考えれば、
ログアウトしてから削除が正しい順序ですよね。

間違ってしまった、失敗してしまったことでも
正しい知識に修正して、覚えていこうと思います。

そうして、少しずつ失敗を減らせるようにしていきたいと思います。
まぁ私も人間なので、全く失敗しないなんてのは無理ですから、
失敗するものとしてテストを忘れないようにしないといけないですね。

最後まで読んでいただき、ありがとうございました。

MeisterGuild(マイスター・ギルド)広報

最先端技術のMEISTERを目指し、お互い切磋琢磨するGUILD、になりたい株式会社マイスター・ギルドです。Webシステム/サービス開発、スマホアプリ開発、AR/VR/MR開発など、さまざまな情報を発信します。

Related Entry