Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
79 views
in Technique[技术] by (71.8m points)

javascript - How can I protect routes in ReactJs?

I am trying to protect my routes with reactjs and hooks. However there is an issue. The user and the token don't update even if make setUser() and setToken() with new values inside them. And it leads to the fact that I can't protect my route. So I hope someone can help me with this!!!

import React, { useState,useEffect} from 'react'
import { Redirect } from 'react-router-dom'

function ProtectedRoutes(props) {
    const [user, setUser] = useState({})
    const [token, setToken] = useState(null)
    const Component = props.component

    useEffect(() => {
        //
            const getUser = async () => {
        
                //Retreive Token
                const sessionToken = await sessionStorage.getItem('token')
                setToken(sessionToken)

                //Fetch User    
                const response = await fetch(`${process.env.REACT_APP_URL}api/users/me`, {
                    method: 'get',
                    headers: new Headers({
                        "x-auth-token": `${token}`
                    })
                })
                const result = await response.json();
                setUser(result)
                //
            
       }
        getUser()
        
        return ()=> {}
       
    },[token,user])
    
    //Token
    if (!token || Object.keys(user).length !== 2) {
        return <Redirect to={{ pathname: '/connexion' }} />
    }
    return <Component/>

}

export default ProtectedRoutes
question from:https://stackoverflow.com/questions/65909957/how-can-i-protect-routes-in-reactjs

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Try something like this

import React from "react";
import { Redirect } from "react-router-dom";

const isAuthenticated = async () => {
  const sessionToken = sessionStorage.getItem("token");

  const response = await fetch(`${process.env.REACT_APP_URL}api/users/me`, {
    method: "get",
    headers: new Headers({ "x-auth-token": `${sessionToken}` })
  });
  const result = await response.json();

  return !!sessionToken && !!(Object.keys(result).length !== 2);
};

function ProtectedRoutes(props) {
  const Component = props.component;

  return isAuthenticated() ? (
    <Component />
  ) : (
    <Redirect to={{ pathname: "/connexion" }} />
  );
}

export default ProtectedRoutes;

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...