API Routes,インプリメンテーションログイン(next.js)


結果



内容


API = isLogin, login, logout
Page = admin, Login
  • admin:isLoginでcookieチェック後に応答がない場合(ログインしていない場合)、Loginページに移動します.応答が受信された場合(ログインしている場合)、adminページ
  • に移動します.
  • Login:IDとパスワードを受け取った後、login(api)で送信し、返信を受け取ってadminページ(ログイン状態)に移動し、ログイン後、isLoginがtrueになり、logoutボタンを生成する
    その後logoutボタンをクリックし、logotapiを呼び出してCookieを削除し、ホームページ
  • に移動する.

    コード#コード#

    //src/top.js
    export default function top () {
        const router = useRouter();
     
            const goLink = data => {
    			 if(data === 'admin')
           		 router.push('/admin')}
            
        return(
            <div>
                <button name='admin'  onClick={() => goLink('admin')}>admin</button>
            </div>
        )
    }
    
    //pages/admin.js
    const admin = () => {
    const router = useRouter();
    const[isLogin, setIsLogin] = useState(false)
    
        const checkLogin = () => {
    		axios.get('/api/isLogin')
    		.then(res => {
             if(res.status === 200 && res.data.name)
             setIsLogin(true)
             else
             router.push('/Login')
        })}
    
    	const logout = () => {
        	axios.get('/api/logout')
        	.then(res => {
            if(res.status === 200 )
            router.push('/')
        })}
    
        useEffect(() => {
            checkLogin();
        },[]);
    
        return(
        <div>
            <p>admin page</p>
            {isLogin && <button onClick={logout}>Logout</button>}
        </div>
        )}
        
     //pages/Login.js
        export default function Login() {
        const router = useRouter();
          
        //api/login으로 post로 내용 보내기
        const login = () => {
            axios.post('api/login')
            .then(res => {
                if(res.status === 200)
                router.push('/admin');
            })}
    
        return(
            <div>
                <input placeholder="id"/>
                <input placeholder="pw" type='password'/>
                <button onClick={login}>Login</button>
            </div>
        )} 
        
      //pages/api/isLogin.js  
        export default function isLogin(req, res) {
            res.status(200).json({ name: req.cookies.a_name })}
    
    //pages/api/login.js
    export default (req, res) => {
    	if(req.method === 'POST')
    	res.setHeader('Set-Cookie', 'a_name=Mike;Max-Age=3600;HttpOnly,Secure')
    	res.statusCode = 200;
    	res.json({ message:'ok'})
    }
    
    //pages/api/login.js
    export default (req, res) => {
        //max-age가 0이 되면 쿠기는 소멸됨
        res.setHeader('Set-Cookie', 'a_name=Mike;Max-Age=0;HttpOnly,Secure')
        res.statusCode = 200;
        res.json({ message:'ok'})
    }