diff --git a/backend/app/Http/Controllers/Api/AuthenticationTrait.php b/backend/app/Http/Controllers/Api/AuthenticationTrait.php index d49a61dd..278f1696 100644 --- a/backend/app/Http/Controllers/Api/AuthenticationTrait.php +++ b/backend/app/Http/Controllers/Api/AuthenticationTrait.php @@ -10,6 +10,18 @@ use Illuminate\Http\Request; // use App\Models\LoginLimits; trait AuthenticationTrait { + private function makeSession ($guard, $db) { + if (!session()->has($guard)) { + // 認証されたデータのpasswordとremember_token以外を把握する + unset($db['password']); + unset($db['remember_token']); + // セッションに保存する + session()->put($guard, $db); + } + + return $db; + } + public function login (Request $r) { // if (null === $r->server('HTTP_USER_AGENT')) { // return ['status_code' => 400, 'error_message' => ['不正なuser_agent。']]; @@ -24,6 +36,15 @@ trait AuthenticationTrait { // } // } + if (isset($_COOKIE['remember_token']) && !is_null($_COOKIE['remember_token'])) { // クッキーがある場合 + if (null === ($get = $this->getModel()->where('remember_token', $_COOKIE['remember_token'])->first())) { // トークンがある場合 + // セッションを想像する + $login_user_datum = $this->makeSession($this->getGuard(), $get->toArray()); + + return ['status_code' => 200, 'params' => ['id' => $login_user_datum['id']]]; + } + } + if ($this->getGuard() == 'children') { Validator::extend('tel_size', function ($attribute, $value, $params, $validator) { return $this->telsize($value); @@ -66,13 +87,15 @@ trait AuthenticationTrait { if (Session::has('admins')) Session::forget('admins'); // セッションを想像する - $guard = $this->getGuard(); - if (!$r->session()->has($guard)) { - // 認証されたデータのpassword以外を把握する - $login_user_datum = $get->toArray(); - unset($login_user_datum['password']); - // セッションに保存する - $r->session()->put($guard, $login_user_datum); + $login_user_datum = $this->makeSession($this->getGuard(), $get->toArray()); + + if ($r->remember_token) { + $token = bin2hex(random_bytes(24)); + + try { + $this->getGuard()->where('id', $login_user_datum['id'])->update(['remember_token' => $token]); + setcookie('remember_token', $token, time()+157788000, '/', $_SERVER['HTTP_HOST'], 0, 1); + } } return ['status_code' => 200, 'params' => ['id' => $login_user_datum['id']]]; @@ -80,7 +103,14 @@ trait AuthenticationTrait { public function logout () { // セッションを破壊すると、ログイン画面に移転する。 - Session::forget($this->getGuard()); + $guard = $this->getGuard(); + if (null !== $rem = $this->getModel()->select('remember_token')->where('id', Session::get()['id'])->first()) { + $this->getModel()->where('id', Session::get()['id'])->update(['remember_token' => null]); + unset($_COOKIE['remember_token']); + setcookie('remember_token', '', time() - 3600, '/', $_SERVER['HTTP_HOST'], 0, 1); + } + + Session::forget($guard); return redirect(request()->route()->action['prefix'].'/login'); } diff --git a/backend/database/migrations/2021_08_10_045054_create_admins_table.php b/backend/database/migrations/2021_08_10_045054_create_admins_table.php index 11cc5871..a55346e2 100644 --- a/backend/database/migrations/2021_08_10_045054_create_admins_table.php +++ b/backend/database/migrations/2021_08_10_045054_create_admins_table.php @@ -17,6 +17,7 @@ class CreateAdminsTable extends Migration $table->id(); $table->string('email', 72)->unique(); $table->string('password', 72); + $table->string('remember_token', 255)->nullable(); $table->timestamps(); }); } diff --git a/backend/database/migrations/2021_08_12_054526_create_fathers_table.php b/backend/database/migrations/2021_08_12_054526_create_fathers_table.php index 3cf52a9c..a4e8559d 100644 --- a/backend/database/migrations/2021_08_12_054526_create_fathers_table.php +++ b/backend/database/migrations/2021_08_12_054526_create_fathers_table.php @@ -17,6 +17,7 @@ class CreateFathersTable extends Migration $table->id(); $table->string('email', 255)->unique(); $table->string('password', 72); + $table->string('remember_token', 255)->nullable(); $table->string('company', 100); $table->string('image', 100)->nullable(); $table->string('profile', 1000)->nullable(); diff --git a/backend/database/migrations/2021_08_13_042143_create_children_table.php b/backend/database/migrations/2021_08_13_042143_create_children_table.php index dc2699cf..931e1a49 100644 --- a/backend/database/migrations/2021_08_13_042143_create_children_table.php +++ b/backend/database/migrations/2021_08_13_042143_create_children_table.php @@ -19,6 +19,7 @@ class CreateChildrenTable extends Migration $table->string('email', 72)->unique(); $table->string('tel', 11)->unique(); $table->string('password', 255); + $table->string('remember_token', 255)->nullable(); $table->string('last_name', 100); $table->string('first_name', 100); $table->string('image', 100)->nullable();