query('token'); $email = $request->query('email'); // トークンのハッシュ化 $tokenHash = hash('sha256', $token); // トークン・メール・24時間以内の有効性をチェック $record = DB::table('password_reset_tokens') ->where('ope_mail', $email) ->where('token', $tokenHash) ->first(); if (!$record) { return redirect()->route('forgot_password') ->withErrors(['email' => 'URLの有効期限(24時間)が切れました。再度お手続きを行ってください。']); } // 24時間チェック $createdAt = \Carbon\Carbon::parse($record->created_at); if ($createdAt->addHours(24)->isPast()) { // 期限切れトークンを削除 DB::table('password_reset_tokens') ->where('ope_mail', $email) ->delete(); return redirect()->route('forgot_password') ->withErrors(['email' => 'URLの有効期限(24時間)が切れました。再度お手続きを行ってください。']); } return view('auth.reset-password', compact('token', 'email')); } public function reset(Request $request) { $request->validate([ 'email' => 'required|email', 'token' => 'required', 'password' => 'required|confirmed|min:8', ]); // トークンのハッシュ化 $tokenHash = hash('sha256', $request->token); // トークン・メール・24時間以内の有効性をチェック $record = DB::table('password_reset_tokens') ->where('ope_mail', $request->email) ->where('token', $tokenHash) ->first(); if (!$record) { return back()->withErrors(['email' => 'URLの有効期限(24時間)が切れました。再度お手続きを行ってください。']); } // 24時間チェック $createdAt = \Carbon\Carbon::parse($record->created_at); if ($createdAt->addHours(24)->isPast()) { // 期限切れトークンを削除 DB::table('password_reset_tokens') ->where('ope_mail', $request->email) ->delete(); return back()->withErrors(['email' => 'URLの有効期限(24時間)が切れました。再度お手続きを行ってください。']); } // パスワード更新 $user = Ope::where('ope_mail', $request->email)->first(); if (!$user) { return back()->withErrors(['email' => 'ユーザーが見つかりません。']); } $user->password = Hash::make($request->password); $user->updated_at = now(); // パスワード再設定時もope_pass_changed_atを更新 $user->ope_pass_changed_at = now(); $user->save(); // トークン削除 DB::table('password_reset_tokens')->where('ope_mail', $request->email)->delete(); // パスワード再設定成功画面へリダイレクト return redirect()->route('password.change.success'); } }