reactjs authentication redirect react-router

reactjs - Realización de autenticación en rutas con react-router-v4



authentication redirect (1)

En react-router v4 , puede hacer uso de render prop to Route junto con los métodos del ciclo de vida para reemplazar la funcionalidad onEnter existente en react-router v3.

Vea esta respuesta para más detalles:

stackoverflow.com/questions/45429963/…

Sin embargo, dado que todo lo que desea hacer es la autenticación en el accesorio onEnter, puede crear fácilmente un HOC que lo haga

const RequireAuth = (Component) => { return class App extends Component { componentWillMount() { const getToken = localStorage.getItem(''token''); if(!getToken) { this.props.history.replace({pathname: ''/''}); } } render() { return <Component {...this.props} /> } } } export { RequireAuth }

y úsalo como

<Route path={"/Dashboard"} component={RequireAuth(Dashboard)}/>

Editar: en caso de que necesite hacer una llamada de red para averiguar si el uso está autenticado o no, debe escribir el HOC como

const RequireAuth = (Component) => { return class App extends Component { state = { isAuthenticated: false, isLoading: true } componentDidMount() { AuthCall().then(() => { this.setState({isAuthenticated: true, isLoading: false}); }).catch(() => { this.setState({isLoading: false}); }) } render() { const { isAuthenticated, isLoading } = this.state; if(isLoading) { return <div>Loading...</div> } if(!isAuthenticated) { return <Redirect to="/login" /> } return <Component {...this.props} /> } } } export { RequireAuth }

Actualizar:

Además del HOC, también puede PrivateRoute por el componente PrivateRoute como

const PrivateRoute = ({component: Component, isAuthenticated, isLoading, ...rest }) => { if(isLoading) { return <div>Loading...</div> } if(!isAuthenticated) { return <Redirect to="/login" /> } return <Component {...this.props} /> } } } export { PrivateRoute };

y puedes usarlo como

class App extends Component { state = { isAuthenticated: false, isLoading: true } componentDidMount() { AuthCall().then(() => { this.setState({isAuthenticated: true, isLoading: false}); }).catch(() => { this.setState({isLoading: false}); }) } render() { <Router> <div> <Route exact path={"/"} component={Home} /> <Route path={"/SignUp"} component={SignUp} /> <Route path={"/SignIn"} component={SignIn} /> <PrivateRoute path={"/Dashboard"} component={Dashboard} isAuthenticated={this.state.isAuthenticated} isLoading={this.isLoading}/> </div> </Router> } }

Estoy tratando de escribir la verificación de Authentication para mi DashBoard . Pero la función en sí no se llama. ¿Alguien puede darme alguna solución para esto? Estoy desarrollando en ReactJs.

Esta es la parte de la ruta:

<Router> <div> <Route exact path={"/"} component={Home} /> <Route path={"/SignUp"} component={SignUp} /> <Route path={"/SignIn"} component={SignIn} /> <Route path={"/Dashboard"} component={Dashboard} onEnter={this.requireAuth} /> </div> </Router>

Esta es la función:

requireAuth (nextState, replace) { console.log("?????????????",this.state.getToken); if(!this.state.getToken) { replace({pathname: ''/''}); } }