giftcon_dev/app/Http/Controllers/Web/Auth/FindPasswordController.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));
}
}