2021-10-25 20:16:43 +09:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
|
|
|
|
use App\Http\Controllers\Controller, Session;
|
|
|
|
use Illuminate\Support\Facades\Validator;
|
|
|
|
use Illuminate\Support\Facades\Hash;
|
|
|
|
use Illuminate\Http\Request;
|
2022-01-17 15:34:02 +09:00
|
|
|
use Illuminate\Support\Facades\Log;
|
2021-10-25 20:16:43 +09:00
|
|
|
|
2022-01-17 16:13:58 +09:00
|
|
|
use App\Models\LoginLimits;
|
|
|
|
|
2021-10-25 20:16:43 +09:00
|
|
|
// use App\Models\LoginLimits;
|
|
|
|
|
|
|
|
trait AuthenticationTrait {
|
2022-01-17 14:36:16 +09:00
|
|
|
private function makeSession ($guard, $db) {
|
2022-01-19 14:39:32 +09:00
|
|
|
session()->regenerate();
|
|
|
|
|
2022-01-17 14:36:16 +09:00
|
|
|
if (!session()->has($guard)) {
|
|
|
|
// 認証されたデータのpasswordとremember_token以外を把握する
|
|
|
|
unset($db['password']);
|
|
|
|
unset($db['remember_token']);
|
|
|
|
// セッションに保存する
|
|
|
|
session()->put($guard, $db);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $db;
|
|
|
|
}
|
|
|
|
|
2022-01-19 14:39:32 +09:00
|
|
|
public function checkSession () {
|
|
|
|
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']]];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ['status_code' => 202];
|
|
|
|
}
|
|
|
|
|
2021-10-25 20:16:43 +09:00
|
|
|
public function login (Request $r) {
|
2022-01-17 16:13:58 +09:00
|
|
|
$loginid = $this->getGuard() == 'children' ? $r->tel : $r->email;
|
|
|
|
|
|
|
|
if (null !== ($ll = LoginLimits::where('login_id', $loginid)->first())) {
|
|
|
|
if ((time() >= strtotime($ll->updated_at) + 600) === true) {
|
|
|
|
LoginLimits::where('login_id', $loginid)->delete();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (null !== ($ll = LoginLimits::where('login_id', $loginid)->first()) && $ll->fail_number >= 10) {
|
2022-01-18 12:44:48 +09:00
|
|
|
return ['status_code' => 400, 'error_message' => ['10回連続で失敗したため、10分間はログインができなくなりました。']];
|
2022-01-17 16:13:58 +09:00
|
|
|
}
|
|
|
|
}
|
2021-10-25 20:16:43 +09:00
|
|
|
|
2021-11-10 11:53:07 +09:00
|
|
|
if ($this->getGuard() == 'children') {
|
|
|
|
Validator::extend('tel_size', function ($attribute, $value, $params, $validator) {
|
2021-11-22 21:48:48 +09:00
|
|
|
return $this->telsize($value);
|
2021-11-10 11:53:07 +09:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-11-05 12:01:23 +09:00
|
|
|
$chk = $this->getGuard() == 'children' ?
|
2021-11-10 11:53:07 +09:00
|
|
|
['tel', $r->tel, 'numeric|starts_with:0|tel_size'] :
|
2021-11-05 12:01:23 +09:00
|
|
|
['email', $r->email, 'max:255|email'];
|
|
|
|
|
2021-10-25 20:16:43 +09:00
|
|
|
$validate = Validator::make($r->all(), [
|
2021-11-05 12:01:23 +09:00
|
|
|
$chk[0] => 'required|'.$chk[2],
|
2021-12-19 11:32:45 +09:00
|
|
|
'password' => ['required', 'min:8', 'max:72', new \App\Rules\Hankaku],
|
2021-10-25 20:16:43 +09:00
|
|
|
]);
|
|
|
|
|
|
|
|
// バリデーションエラー
|
|
|
|
if ($validate->fails()) {
|
|
|
|
return ['status_code' => 422, 'error_messages' => $validate->errors()];
|
|
|
|
}
|
|
|
|
|
|
|
|
// 存在しない場合
|
2021-11-05 12:01:23 +09:00
|
|
|
if (null === ($get = $this->getModel()->where($chk[0], $chk[1])->first())) {
|
2022-01-17 16:13:58 +09:00
|
|
|
if (null !== ($loglim = LoginLimits::where('login_id', $loginid)->first())) {
|
|
|
|
LoginLimits::where('login_id', $loginid)->increment('fail_number');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
LoginLimits::create(['login_id' => $loginid, 'fail_number' => 1]);
|
|
|
|
}
|
|
|
|
|
2021-10-25 20:16:43 +09:00
|
|
|
return ['status_code' => 400, 'error_message' => ['ログインに失敗しました。10回連続で失敗すると、一定期間ログインできなくなります。']];
|
|
|
|
}
|
|
|
|
|
|
|
|
// パスワードが異なる場合
|
|
|
|
if (!Hash::check($r->password, $get->password)) {
|
2022-01-17 16:13:58 +09:00
|
|
|
if (null !== ($loglim = LoginLimits::where('login_id', $loginid)->first())) {
|
|
|
|
LoginLimits::where('login_id', $loginid)->increment('fail_number');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
LoginLimits::create(['login_id' => $loginid, 'fail_number' => 1]);
|
|
|
|
}
|
|
|
|
|
2021-10-25 20:16:43 +09:00
|
|
|
return ['status_code' => 400, 'error_message' => ['ログインに失敗しました。10回連続で失敗すると、一定期間ログインできなくなります。']];
|
|
|
|
}
|
|
|
|
|
2021-11-30 13:34:14 +09:00
|
|
|
// 既にセッションがあれば、ログアウトします。
|
|
|
|
if (Session::has('children')) Session::forget('children');
|
|
|
|
if (Session::has('fathers')) Session::forget('fathers');
|
|
|
|
if (Session::has('admins')) Session::forget('admins');
|
2022-01-19 14:39:32 +09:00
|
|
|
unset($_COOKIE['remember_token']);
|
|
|
|
setcookie('remember_token', '', time() - 3600, '/', $_SERVER['HTTP_HOST'], 0, 1);
|
2021-11-30 13:34:14 +09:00
|
|
|
|
2022-01-17 15:34:02 +09:00
|
|
|
if ($r->remember_token == 'true') {
|
2022-01-17 14:36:16 +09:00
|
|
|
$token = bin2hex(random_bytes(24));
|
|
|
|
|
|
|
|
try {
|
2022-01-17 15:34:02 +09:00
|
|
|
$this->getModel()->where('id', $get->id)->update(['remember_token' => $token]);
|
2022-01-18 00:02:54 +09:00
|
|
|
setcookie('remember_token', $token, time()+157788000, '/', $_SERVER['HTTP_HOST'], false, true);
|
2022-01-17 14:36:16 +09:00
|
|
|
}
|
2022-01-17 15:34:02 +09:00
|
|
|
catch (\Throwable $e) {
|
|
|
|
Log::critical($e->getMessage());
|
|
|
|
return ['status_code' => 400, 'error_message' => ['ログインに失敗しました。10回連続で失敗すると、一定期間ログインできなくなります。']];
|
|
|
|
}
|
2021-10-25 20:16:43 +09:00
|
|
|
}
|
|
|
|
|
2022-01-17 15:34:02 +09:00
|
|
|
// セッションを想像する
|
|
|
|
$login_user_datum = $this->makeSession($this->getGuard(), $get->toArray());
|
|
|
|
|
2021-12-30 14:29:48 +09:00
|
|
|
return ['status_code' => 200, 'params' => ['id' => $login_user_datum['id']]];
|
2021-10-25 20:16:43 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
public function logout () {
|
|
|
|
// セッションを破壊すると、ログイン画面に移転する。
|
2022-01-17 14:36:16 +09:00
|
|
|
$guard = $this->getGuard();
|
2022-01-17 15:34:02 +09:00
|
|
|
if (null !== $rem = $this->getModel()->select('remember_token')->where('id', session()->get($guard)['id'])->first()) {
|
|
|
|
$this->getModel()->where('id', session()->get($guard)['id'])->update(['remember_token' => null]);
|
2022-01-17 14:36:16 +09:00
|
|
|
unset($_COOKIE['remember_token']);
|
|
|
|
setcookie('remember_token', '', time() - 3600, '/', $_SERVER['HTTP_HOST'], 0, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
Session::forget($guard);
|
2021-10-25 20:16:43 +09:00
|
|
|
|
|
|
|
return redirect(request()->route()->action['prefix'].'/login');
|
|
|
|
}
|
2021-12-30 14:29:48 +09:00
|
|
|
}
|