회원가입, 로그인, 로그아웃 기능 구현

kimyz·2023년 11월 30일

각 기능 구현하기

회원가입

파이어베이스에 있는 인증 기능을 통해서 회원가입 기능을 구현하였다.
createUserWithEmailAndPassword 메서드를 이용하면 간단하게 할 수 있다.

import { getAuth, createUserWithEmailAndPassword } from 'firebase/auth'

const [email, setEmail] = useState('')
const [password, setPassword] = useState('')

async function onSubmit(event) {
	// ...
  	try {
    	const auth = getAuth(app)
        // auth 정보, 이메일 그리고 비밀번호 값을 매개 변수로 던져준다.
        await createUserWithEmailAndPassword(auth, email, password)
    } catch (error) {
    	// 에러처리
    }
}

로그인

회원가입과 동일하게 signInWithEmailAndPassword 메서드 이용해서 구현했다.


로그아웃

로그아웃은 signOut 이라는 메서드를 사용하여 구현했다.


로그인 상태 인식하기

파이어베이스 Auth 기능에는 onAuthStateChanged 라는 메서드가 있다.
로그인, 로그아웃 함수에 따라서 로그인 상태에 대한 변화를 체크할 수 있도록 옵저버를 추가하는 기능을 한다.
(참고: https://firebase.google.com/docs/reference/js/v8/firebase.auth.Auth#onauthstatechanged)

  useEffect(() => {
    onAuthStateChanged(auth, (user) => {
      if (user) {
        setIsAuthenticated(true)
      } else {
        setIsAuthenticated(false)
      }
      setInit(true)
    })
  }, [auth])

로그인 또는 로그아웃을 하게 되면 isAuthenticated 상태를 업데이트 하게 되고, 그에 따라 화면도 바뀌게 된다.

또한 상태값을 참조하여 <로그인 된 상태>에서는 로그인 / 회원가입 창을 보지 못하게 하고
<로그인이 되지 않은 상태>에서는 로그인 / 회원가입 화면만 보게 할 수 있었다.

// 전체를 아우르는 컴포넌트에서 상태값에 따라 다른 화면을 보여주게 함
<div className='layout'>
    {isAuthenticated && init && (
         <>
             <SideBar />
             <main className='main'>{children}</main>
         </>
    )}
	{!isAuthenticated && init && <SignPage />}
</div>
     
// 로그인, 회원가입 컴포넌트에 대한 페이지는 로그인 된 경우에는 보이지 않게 함
const router = useRouter()
if (getAuth(app)?.currentUser && router.pathname === '/sign') router.push('/')
else return <SignForm />

사실 저렇게 하는 방법은 좀,, 틀린 방법인 것 같은 생각이 아주 많이 들었다.

지금 세일즈서포터는 로그인, 회원가입 화면을 하나의 컴포넌트로 생성하여 상태에 따라 다르게 보여주고 있으며,
그 컴포넌트에 'sign' 이라는 주소를 부여해 주었다 (pages router 사용중이라서 pages > sign > index.js로 생성함)

나는 세일즈서포터에 로그인이 되었다는 전제하에 하나의 레이아웃으로 왼쪽: 사이드바, 오른쪽: 해당 페이지 로 작성을 했기 때문에
그 하나의 레이아웃에서 벗어나는 컴포넌트 (여기에서는 로그인 / 회원가입) 는 어떻게 해결해야 하는지를 몰랐다.

그래서 sign 페이지에 개별적으로 저런 조건을 추가해서 강제로 홈페이지로 이동하게 하였다.
페이지를 이동하지 않으면 주소창에 sign이 남아있는 상태로 화면만 바뀌기 때문에 내가 원하는 것은 아니었다.

추후에 더 좋은 방법을 알게 된다면 수정하도록 해야겠다.

profile
😛

0개의 댓글