-
MERN 기본파일 만들기 - 14)LogoutPage 만들기, Auth 인증 체크하기NODE.JS 2021. 5. 24. 14:41
로그아웃 페이지는 새로 생성하지 않고, 랜딩페이지에다 버튼을 추가할 것이다.
import React, { useEffect } from 'react' import axios from 'axios'; import { withRouter } from 'react-router-dom'; //props.history.push("") 쓰기 위해서 필요하다 function LandingPage(props) { useEffect(() => { axios.get('/api/hello') .then(response => { console.log(response) }) }, []) const onClickHandler = () => { axios.get(`/api/users/logout`) .then(response => { if (response.data.success) { props.history.push("/login") } else { alert('로그아웃 하는데 실패 했습니다.') } }) } return ( <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' , width: '100%', height: '100vh' }}> <h2>시작 페이지</h2> <button onClick={onClickHandler}> 로그아웃 </button> </div> ) } export default withRouter(LandingPage)
이제 인증기능을 추가해보자.
hoc를 이용해서 Auth 를 구현할 것이다.
hoc 폴더안에 auth.js파일을 만들어 준다.
import React, { useEffect } from 'react'; import Axios from 'axios'; import { useDispatch } from 'react-redux'; import { auth } from '../_actions/user_action'; //여기서 =null 해주지 않다도 따로 입력하지 않으면 기본으로 null이다. adminRoute값 없으면 null으로 기본설정, 값 넣으면 admin 설정에 따라서 작동 export default function (SpecificComponent, option, adminRoute = null) { //null => 아무나 출입이 가능한 페이지 //true => 로그인한 유저만 출입이 가능한 페이지 //false => 로그인한 유저는 출입 불가능한 페이지 function AuthenticationCheck(props) { const dispatch = useDispatch(); useEffect(() => { //auth route를 이용해서 접근가능한지 확인한다. dispatch(auth()).then(response => { console.log(response) //로그인 하지 않은 상태 if (!response.payload.isAuth) { if (option) { props.history.push('/login') } } else { //로그인 한 상태 if (adminRoute && !response.payload.isAdmin) { props.history.push('/') } else { if (option === false) props.history.push('/') } } }) }, []) return ( <SpecificComponent /> ) } return AuthenticationCheck }
user_action.js에도 기능을 추가해준다.
import axios from 'axios'; import { LOGIN_USER, REGISTER_USER, AUTH_USER } from './types'; export function loginUser(dataToSubmit) { const request = axios.post('/api/users/login', dataToSubmit) .then(response => response.data) return { type: LOGIN_USER, payload: request } } export function registerUser(dataToSubmit) { const request = axios.post('/api/users/register', dataToSubmit) .then(response => response.data) return { type: REGISTER_USER, payload: request } } export function auth() { const request = axios.get('/api/users/auth') .then(response => response.data) return { type: AUTH_USER, payload: request } }
types.js에도 추가
export const LOGIN_USER = "login_user"; export const REGISTER_USER = "register_user"; export const AUTH_USER = "auth_user";
reducer에도 케이스를 하나 추가해준다.
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 } break; case REGISTER_USER: return { ...state, register: action.payload } break; case AUTH_USER: return { ...state, userData: action.payload }//라우터에서 정보를 받아오기 때문에 이름을 userData로 했다. break; default: return state; } }
app.js에도 auth 구문을 넣어준다.
import React from 'react'; import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom"; import LandingPage from './components/views/LandingPage/LandingPage' import LoginPage from './components/views/LoginPage/LoginPage'; import RegisterPage from './components/views/RegisterPage/RegisterPage'; import Auth from './hoc/auth' function App() { return ( <Router> <div> {/* A <Switch> looks through all its children <Route> elements and renders the first one whose path matches the current URL. Use a <Switch> any time you have multiple routes, but you want only one of them to render at a time */} <Switch> //auth컴포넌트가 감싸준다. <Route exact path="/" component={Auth(LandingPage, null ) } /> <Route exact path="/login" component={Auth(LoginPage, false) } /> <Route exact path="/register" component={Auth(RegisterPage, false)} /> </Switch> </div> </Router> ); } export default App;
'NODE.JS' 카테고리의 다른 글
아마존 E-commerce 클론 -2) 리액트 만들고 페이지 동적으로 만들기 (0) 2021.05.26 아마존 E-commerce 클론 -1) html 파일만들고 css 설정하기 (0) 2021.05.26 Social Media 만들기 - 1)앱 만들기 전 Setup 하기 (0) 2021.05.20 OnlineShop 만들기 - 14) History 기능 만들기 (0) 2021.05.16 OnlineShop 만들기 - 13) Cart Page 만들기 4 ( paypal 기능 만들기) (0) 2021.05.16