Laravel のremember_token
- 2020.03.03
- 研修
- Laravel, logout, 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_token
がupdate
処理により更新されます。
ここまでは、「そうなのか」で済む動作ですね。
ユーザが復活!?
さて、上記のコードをテストしたと言いました。
そして、ユーザが削除できないとも言いました。
しかし、それは正しい動作の説明ではありません。
実は、しっかりとユーザの情報は削除されています。
しかし、ログアウト処理を行った際に
insert
処理が行われているのです。
どうやら、
remember_token
をsession
で保持したユーザが見つからなかったとき
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("/");
}
よく考えれば、
ログアウトしてから削除が正しい順序ですよね。
間違ってしまった、失敗してしまったことでも
正しい知識に修正して、覚えていこうと思います。
そうして、少しずつ失敗を減らせるようにしていきたいと思います。
まぁ私も人間なので、全く失敗しないなんてのは無理ですから、
失敗するものとしてテストを忘れないようにしないといけないですね。
最後まで読んでいただき、ありがとうございました。
-
前の記事
GetでQuery(Parameter)を渡す方法 2020.02.25
-
次の記事
【Zoom?Remo?Whereby?】いろんなWeb会議サービスを試してみた 2020.04.17