ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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;

     

     

     

Designed by Tistory.