#33 인증 체크

2022. 8. 4. 21:44TIL/따라하며 배우는 노드 리액트

728x90
[인프런] 따라하며 배우는 노드, 리액트 시리즈 - 기본강의를 들으며 정리한 내용입니다.

 

HOC : Higher Order Component
다른 컴포넌트를 받아 새로운 컴포넌트를 리턴하는 함수

 

 

1. hoc/auth.js 파일 생성하기

import React, { useEffect } from "react";
import { useNavigate } from "react-router-dom";
import { useDispatch } from "react-redux";
import { authUser } from "../_actions/user_action";

export default function (SpecificComponent, option, adminRoute = null) {
	//option
	//null => 아무나 출입 가능한 페이지
	//true=> 로그인한 유저만 출입 가능한 페이지
	//false => 로그인한 유저는 출입 불가능한 페이지

	function AuthenticationCheack() {
		const dispatch = useDispatch();
		const navigate = useNavigate();

		useEffect(() => {
			dispatch(authUser()).then((response) => {
				if (!response.payload.isAuth) {
					if (option) {
						navigate("/login");
					}
				} else {
					if (adminRoute && !response.payload.isAdmin) {
						navigate("/");
					} else {
						if (option === false) {
							navigate("/");
						}
					}
				}
			});
		}, []);
		return <SpecificComponent />;
	}

	return <AuthenticationCheack />;
}

 

2. types.js 파일에 AUTH_USER 타입 추가하기

types.js 파일에 AUTH_USER 타입 추가하기

 

3. user_action.js 파일에 authUser 함수 추가하기

import { LOGIN_USER, REGISTER_USER, AUTH_USER } from "./types";

export function authUser() {
	const request = axios
		.get("/api/users/auth")
		.then((response) => response.data);

	return {
		type: AUTH_USER,
		payload: request,
	};
}

 

4. user_reducer.js파일에 case 추가하기

import { LOGIN_USER, REGISTER_USER, AUTH_USER } from "../_actions/types";

export default function (state = {}, action) {
	switch (action.type) {
		case LOGIN_USER:
			return { ...state, loginSuccess: action.payload };

		case REGISTER_USER:
			return { ...state, register: action.payload };

		case AUTH_USER:
			return { ...state, userData: action.payload };

		default:
			return state;
	}
}

 

5. App.js파일에서 Auth로 컴포넌트 감싸주기

import Auth from "../../hoc/auth";

function App() {
	return (
		<Router>
			<Routes>
				<Route exact path="/" element={Auth(LandingPage, null)}></Route>
				<Route exact path="/LoginPage" element={Auth(LoginPage, false)}></Route>
				<Route
					exact
					path="/RegisterPage"
					element={Auth(RegisterPage, false)}
				></Route>
			</Routes>
		</Router>
	);
}

'TIL > 따라하며 배우는 노드 리액트' 카테고리의 다른 글

#32 로그아웃  (0) 2022.08.04
#31 회원 가입 페이지  (0) 2022.08.04
#29,30 로그인 페이지  (0) 2022.08.04
#26,27 Redux 기본 설정  (0) 2022.08.04
#24 Concurrently  (0) 2022.08.04