Skip to main content

Next-Auth-로그인 구현 (3)

작성일 : 2024.12.25

커스텀 로그인 페이지 만들기​

NextAuth는 로그인, 로그아웃, 에러 등 간단한 인증 페이지를 제공해 준다.

기본으로 제공하는 화면들을 커스텀 페이지로 대체할 수 있는데, pages:{} 를 사용하면 된다.

💡 pages 구성 목록​

 import NextAuth from 'next-auth/next'
 const handler = NextAuth({
 providers: [
  ...
  ],
 callbacks:{
 ...
 },
 pages:{
 signIn: '/auth/signin',
 signOut: '/auth/signout',
 error: '/auth/error', // Error code passed in query string as ?error=
 verifyRequest: '/auth/verify-request', // (used for check email message)
 newUser: '/auth/new-user' // New users will be directed here on first sign in (leave the property out if not of interest)
 }
 })
 export { handler as GET, handler as POST }

☝🏻 페이지가 실제로 존재하는 경로를 입력해주어야 한다.​

/app/(auth)/signin/page.tsx 경로에 파일을 만들고, LoginForm 컴포넌트를 사용한다.

import LoginForm from "@/components/form/LoginForm";

export default function LoginModal() {
  return <LoginForm />;
}
"use client";

import { ChangeEventHandler, FormEventHandler, useState } from "react";
import Socials from "./Socials";
import { signIn } from "next-auth/react";

export default function LoginForm() {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");

  const handleSubmit: FormEventHandler<HTMLFormElement> = async (event) => {
    event.preventDefault();
    const result = await signIn("credentials", {
      username: email,
      password: password,
      redirect: true,
      callbackUrl: "/",
    });
    console.log(result);
  };

  const onChangeEmail: ChangeEventHandler<HTMLInputElement> = (e) => {
    setEmail(e.target.value);
  };

  

  const onChangePassword: ChangeEventHandler<HTMLInputElement> = (e) => {
    setPassword(e.target.value);
  };

  

  return (
    <div className="min-h-screen flex items-center justify-center">
      <div className="space-y-4 w-full max-w-md px-4">
        <h2 className="mb-5 text-3xl font-extrabold text-center">
          Next-Auth Login
        </h2>
        <form onSubmit={(e) => handleSubmit(e)} className="space-y-2">
          <input
            name="email"
            placeholder="이메일"
            onChange={onChangeEmail}
            className="w-full p-3 border border-gray-300 rounded-lg bg-gray-50"
          />

          <input
            type="password"
            name="password"
            placeholder="비밀번호"
            onChange={onChangePassword}
            className="w-full p-3 border border-gray-300 rounded-lg bg-gray-50"
          />

          <button className="w-full py-3 bg-blue-800 text-blue-200rounded-2xl hover:bg-blue-700 text-white rounded-3xl">
            Login
          </button>
        </form>
        <Socials />
      </div>
    </div>
  );
}

로그인 전​

로그인 화면​

로그인 후​

메인 화면으로 이동