giftcon_dev/app/Http/Controllers/Web/Auth/LoginController.php

112 lines
3.8 KiB
PHP

<?php
namespace App\Http\Controllers\Web\Auth;
use App\Http\Controllers\Controller;
use App\Services\MemInfoService;
use App\Rules\RecaptchaV3Rule;
use App\Support\AuthSession;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
final class LoginController extends Controller
{
public function show(Request $request)
{
return view('web.auth.login');
}
public function prc(Request $request, MemInfoService $memInfoService)
{
$rules = [
'mem_email' => ['required', 'string', 'email', 'max:60'],
'mem_pw' => ['required', 'string', 'max:100'],
'return_url'=> ['nullable', 'string', 'max:2000'],
];
if (app()->environment('production')) {
$rules['g-recaptcha-response'] = ['required', new RecaptchaV3Rule('login')];
}
$v = Validator::make($request->all(), $rules, [
'mem_email.required' => '아이디 혹은 비밀번호가 일치하지 않습니다.',
'mem_email.email' => '아이디 혹은 비밀번호가 일치하지 않습니다.',
'mem_pw.required' => '아이디 혹은 비밀번호가 일치하지 않습니다.',
'g-recaptcha-response.required' => '올바른 접근이 아닙니다.',
]);
if ($v->fails()) {
return back()->withErrors($v)->withInput();
}
$email = strtolower(trim((string)$request->input('mem_email')));
$pw = (string)$request->input('mem_pw');
// return_url: 오픈리다이렉트 방지 (내부 path만 허용)
$returnUrl = (string)($request->input('return_url') ?? '/');
if ($returnUrl === '' || str_starts_with($returnUrl, 'http://') || str_starts_with($returnUrl, 'https://') || str_starts_with($returnUrl, '//')) {
$returnUrl = '/';
}
if (!str_starts_with($returnUrl, '/')) {
$returnUrl = '/';
}
$res = $memInfoService->attemptLegacyLogin([
'email' => $email,
'password' => $pw,
'ip' => $request->ip(),
'ua' => substr((string)$request->userAgent(), 0, 500),
'return_url' => $returnUrl,
]);
if (!$res['ok']) {
// UI 처리 방식은 프로젝트 스타일에 맞춰
// (일단 errors로 처리)
return back()
->withErrors(['login' => $res['message']])
->withInput(['mem_email' => $email]);
}
// 세션 저장
AuthSession::putMember($res['session']);
return redirect()->to($res['redirect'] ?? $returnUrl);
}
/**
* (옵션) 휴면 해제 링크 처리 - 최소 골격
* 실제 로직은 다음 단계에서 dormancy 테이블 검증/만료/상태변경까지 붙이면 됨
*/
public function dormancyPrc(Request $request)
{
// TODO: Crypt::decryptString(authnum) -> "auth_key|seq"
// TODO: mem_dormancy 검증/만료/인증완료 처리
return redirect()->route('web.auth.login')
->withErrors(['login' => '휴면 해제 처리는 다음 단계에서 연결합니다.']);
}
public function logout(Request $request)
{
$request->session()->forget('_sess');
// (선택) 회원가입/본인인증 진행 세션까지 같이 정리하고 싶으면 추가
$request->session()->forget('signup');
$request->session()->forget('register');
// (선택) 디버그 세션 정리
$request->session()->forget('debug');
// ✅ 세션 저장
$request->session()->save();
return redirect()->route('web.home')
->with('ui_dialog', [
'type' => 'alert',
'title' => '안내',
'message' => '로그아웃 되었습니다.',
]);
}
}