Phantom Programming 팬텀 프로그래밍
  • [개발 일지] 온라인 쇼핑몰 회원가입 후 Session 유지 구현
    2024년 11월 28일 16시 35분 45초에 업로드 된 글입니다.
    작성자: Devrun
    반응형

     

    오늘은 어제 밤새고 조금 자다가 일어나서 작업하던 것을 마무리 했습니다. 홈 화면에서 로그인 화면으로 이동 회원가입으로 이동해서 회원가입을 완료하고 제대로 동작한다면, 다시 Home 화면으로 돌아오고 Account라는 링크가 Logout 링크로 변경되게 구현해보았습니다. 

     

    Session이 없다면, Logout 링크가 보여지지 않게 설정했습니다.

     

    AuthController.cs

    namespace UrbanShop.Controllers
    {
        public class AuthController : Controller
        {
            //AppDbContext
            private readonly AppDbContext _context;
    
            //AppDbContext Constructor
            public AuthController(AppDbContext context)
            {
                _context = context;
            }
    
            [HttpGet]
            public IActionResult Index()
            {
                return View();
            }
    
            public IActionResult SignUp()
            {
                return View();
            }
    
            [HttpPost]
            public async Task<IActionResult> SignUp(SignUpViewModel model)
            {
                if (ModelState.IsValid)
                {
                    // Check Account
                    var existingAccount = await _context.Account.FirstOrDefaultAsync(a => a.User_Account == model.User_Account);
    
                    //Display Error when user account already in DB
                    if (existingAccount != null)
                    {
                        ModelState.AddModelError("User_Account", "This account already exists.");
                    }
    
                    //Check Email
                    var existingEmail = await _context.Customers.FirstOrDefaultAsync(c => c.Customer_Email == model.Customer_Email);
    
                    //Display error when user email already in DB
                    if (existingEmail != null)
                    {
                        ModelState.AddModelError("Customer_Email", "This email is already registered.");
                    }
    
                    var account = new Account
                    {
                        User_Account = model.User_Account,
                        User_Password = model.User_Password
                    };
    
                    var customer = new Customer
                    {
                        Customer_Name = model.Customer_Name,
                        Customer_Email = model.Customer_Email,
                        Customer_Phone = model.Customer_Phone,
                    };
    
                    //Saving Account Data To DB
                    await _context.Account.AddAsync(account);
                    await _context.SaveChangesAsync();
    
                    //Add Account ID From Account -> Customer Table Account_ID(FK)
                    customer.Account_ID = account.Account_ID;
    
                    //Saving Customer Data To DB
                    await _context.Customers.AddAsync(customer);
                    await _context.SaveChangesAsync();
    
                    //After finished sign up set session
                    var claims = new List<Claim>
                    {
                        new Claim(ClaimTypes.Name, account.User_Account),
                        new Claim("AccountId", account.Account_ID.ToString())
                    };
    
                    var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
    
                    await HttpContext.SignInAsync("UrbanShopAuth", new ClaimsPrincipal(claimsIdentity), new AuthenticationProperties
                    {
                        IsPersistent = true,
                        ExpiresUtc = DateTime.UtcNow.AddHours(1)
                    });
    
                    return RedirectToAction("Index", "Home");
                }
    
                //Redirect view to home
                return RedirectToAction("Index", "Home");
            }
    
            [HttpPost]
            public async Task<IActionResult> Logout()
            {
                await HttpContext.SignOutAsync("UrbanShopAuth");
                return RedirectToAction("Index", "Home");
            }
    
        }
    }

     

    HomeController.cs

            [AllowAnonymous] // 홈 화면은 인증 없이 접근 가능
            public IActionResult Index()
            {
                var userName = User.Identity.Name;
                var accountId = User.FindFirst("AccountId")?.Value;
    
                ViewBag.UserName = userName;
                ViewBag.AccountId = accountId;
    
                return View();
            }
    
            [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
            public IActionResult Error()
            {
                return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
            }

     

    일단 AuthController에서 회원가입 프로세스를 완료하고 session을 만들어서 데이터를 전송합니다. 쿠키에 데이터를 저장해두기 때문에 쿠키 UrbanShopAuth라는 쿠키를 생성해서 관리합니다.

     

    일단 여기서 가장 큰 문제는 맨처음 Home화면에서였습니다.

     

    Home controller를 보면 [AllowAnonymous]라는 것이 있는데, 맨 처음에는 저 기능을 없이 했더니 홈화면이 인증되지 않은 사용자한테는 보여지지 않는 문제를 발견했다.해당 문제를 해결하기 위해 GPT / StackOverflow를 사용해 지식을 참고해서 다시 구현했습니다. 대략적으로 3시간 걸린 것 같습니다.

     

    인증 구현 단계에서 체크해야할 부분이 많지만, 거기를 구현하지 못 했지만, 추후에 다시 구현할 예정이다.

     

    오늘도 하나의 기능을 완료!

    (사실 졸려서 뭐라고 쓰는지도 모르겠다...)

    반응형
    댓글