페이지 중 메인페이지는 로그인한 회원만 진입이 가능한 페이지고, 로그인 페이지와 회원가입 페이지는 로그인한 회원은 진입하지 못하는 페이지 이다.
그러나 지금은 URL을 통한 접근 시 로그인 하지 않아도 접속이 가능하다.
인증 기능을 추가하여 해당 문제를 해결해보자 !
이런 경우 higher-order component function
을 사용해 인증을 처리할 수 있다.
higher-order component function
은 컴포넌트를 인자로 받아 새로운 컴포넌트를 리턴하는 함수이다.import React, {useEffect} from 'react';
import { useSelector } from 'react-redux';
import {getAuth, onAuthStateChanged} from "firebase/auth"
import { useNavigate } from 'react-router-dom';
import { useDispatch} from 'react-redux';
import { authUser } from '../_redux/user';
export default function (SpecificComponent, option){
//유저가 로그인 상태인지 확인하기
//파이어베이스 onAuthStateChanged 기능 이용
//option
// null > 아무나 출입이 가능한 페이지
// true > 로그인한 유저만 출입이 가능한 페이지
// false > 로그인한 유저는 출입 불가능한 페이지
function AuthenticationCheck(props){
const loggedin = localStorage.getItem('isLoggedIn');
const auth = getAuth();
const dispatch = useDispatch();
const navigate = useNavigate();
useEffect(()=>{
onAuthStateChanged(auth, (userlogined)=>{
if (userlogined){
if(option===false && loggedin===true){
console.log("Logged in")
navigate('/')
}
dispatch(authUser(userlogined.uid))
}else{
if(option===true){
// 사용자가 로그아웃한 상태이고, 페이지가 로그인한 사용자만 허용하는 경우
console.log("not Logged in")
navigate('/signin')
}
}
})
},[auth, navigate, dispatch, loggedin])
return <SpecificComponent{...props} />
}
return AuthenticationCheck
}
AuthenticationCheck
는 HOC을 생성하고 반환하는 함수 SpecificComponent
: HOC가 래핑할 페이지 컴포넌트를 나타냄option
: 각 컴포넌트의 옵션은 3가지가 있다.SpecificComponent
를 반환export default auth(SignupPage, false);
export default auth(SigninPage, false);
export default auth(MainPage, true);