파이어베이스에 있는 인증 기능을 통해서 회원가입 기능을 구현하였다.
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이 남아있는 상태로 화면만 바뀌기 때문에 내가 원하는 것은 아니었다.
추후에 더 좋은 방법을 알게 된다면 수정하도록 해야겠다.