140 lines
4.8 KiB
PHP
140 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Web\Auth;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Rules\RecaptchaV3Rule;
|
|
use App\Services\FindPasswordService;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Validator;
|
|
|
|
class FindPasswordController extends Controller
|
|
{
|
|
public function show(Request $request)
|
|
{
|
|
$sess = (array) $request->session()->get('find_pw', []);
|
|
|
|
$step = 1;
|
|
if (!empty($sess['verified'])) $step = 3;
|
|
else if (!empty($sess['sent'])) $step = 2;
|
|
|
|
return view('web.auth.find_password', [
|
|
'initialStep' => $step,
|
|
'email' => $sess['email'] ?? null,
|
|
'name' => $sess['name'] ?? null,
|
|
]);
|
|
}
|
|
|
|
public function sendMail(Request $request, FindPasswordService $svc)
|
|
{
|
|
$rules = [
|
|
'email' => ['required', 'email', 'max:120'],
|
|
'name' => ['required', 'string', 'max:50'],
|
|
];
|
|
|
|
if (app()->environment('production')) {
|
|
$rules['g-recaptcha-response'] = ['required', new RecaptchaV3Rule('find_pass')];
|
|
}
|
|
|
|
$v = Validator::make($request->all(), $rules, [
|
|
'email.required' => '이메일을 입력해 주세요.',
|
|
'email.email' => '이메일 형식이 올바르지 않습니다.',
|
|
'name.required' => '성명을 입력해 주세요.',
|
|
'g-recaptcha-response.required' => '올바른 접근이 아닙니다.',
|
|
]);
|
|
|
|
if ($v->fails()) {
|
|
return response()->json([
|
|
'ok' => false,
|
|
'message' => $v->errors()->first(),
|
|
], 422);
|
|
}
|
|
|
|
$email = (string) $request->input('email');
|
|
$name = (string) $request->input('name');
|
|
|
|
$res = $svc->sendResetMail($request, $email, $name, 30);
|
|
|
|
if (!($res['ok'] ?? false)) {
|
|
return response()->json([
|
|
'ok' => false,
|
|
'code' => $res['code'] ?? null,
|
|
'message' => $res['message'] ?? '요청 처리 중 오류가 발생했습니다.',
|
|
'step' => $res['step'] ?? 1,
|
|
], (int)($res['status'] ?? 400));
|
|
}
|
|
|
|
if (!empty($res['session'])) {
|
|
$request->session()->put('find_pw', $res['session']);
|
|
}
|
|
|
|
return response()->json([
|
|
'ok' => true,
|
|
'message' => $res['message'] ?? '인증메일을 발송했습니다.',
|
|
'expires_in' => $res['expires_in'] ?? 1800,
|
|
'step' => $res['step'] ?? 2,
|
|
]);
|
|
}
|
|
|
|
|
|
public function verifyLink(Request $request, FindPasswordService $svc)
|
|
{
|
|
$memNo = (int) $request->query('mem_no', 0);
|
|
|
|
$res = $svc->verifyResetLink($request, $memNo);
|
|
|
|
if (!($res['ok'] ?? false)) {
|
|
return redirect()->route('web.auth.find_password.show')
|
|
->with('ui_dialog', [
|
|
'type' => 'alert',
|
|
'title' => '안내',
|
|
'message' => $res['message'] ?? '잘못된 접근입니다.',
|
|
]);
|
|
}
|
|
|
|
// 인증완료 세션 세팅
|
|
if (!empty($res['session'])) {
|
|
$request->session()->put('find_pw', $res['session']);
|
|
}
|
|
|
|
return redirect()->route('web.auth.find_password.show')
|
|
->with('ui_dialog', [
|
|
'type' => 'alert',
|
|
'title' => '안내',
|
|
'message' => $res['message'] ?? '인증이 완료되었습니다.',
|
|
]);
|
|
}
|
|
|
|
public function reset(Request $request, FindPasswordService $svc)
|
|
{
|
|
$v = Validator::make($request->all(), [
|
|
'new_password' => [
|
|
'required', 'string', 'min:8', 'max:20',
|
|
'regex:/^(?=.*[A-Za-z])(?=.*\d)(?=.*[^A-Za-z0-9\s]).+$/'
|
|
],
|
|
'new_password_confirmation' => ['required', 'same:new_password'],
|
|
], [
|
|
'new_password.required' => '새 비밀번호를 입력해 주세요.',
|
|
'new_password.min' => '비밀번호는 8자리 이상이어야 합니다.',
|
|
'new_password.max' => '비밀번호는 20자리를 초과할 수 없습니다.',
|
|
'new_password.regex' => '비밀번호는 영문+숫자+특수문자를 포함해야 합니다.',
|
|
'new_password_confirmation.same' => '비밀번호 확인이 일치하지 않습니다.',
|
|
]);
|
|
|
|
if ($v->fails()) {
|
|
return response()->json(['ok' => false, 'message' => $v->errors()->first()], 422);
|
|
}
|
|
|
|
$pw = (string) $request->input('new_password');
|
|
|
|
$res = $svc->resetPasswordFinal($request, $pw);
|
|
|
|
return response()->json([
|
|
'ok' => (bool)($res['ok'] ?? false),
|
|
'message' => $res['message'] ?? '',
|
|
'redirect_url' => $res['redirect_url'] ?? null,
|
|
], (int)($res['status'] ?? 200));
|
|
}
|
|
|
|
}
|