Skip to content
the poor coder

How to handle protected routes in React plus redirect user to original URL being visited

Poor Man
Published
Reading time
4 min read
On this page

Handling Protected Routes in React and Redirecting Users#

Protected routes are a crucial part of any web application that requires authentication. In React, we can use Higher Order Components (HOCs) to protect certain routes that require authentication.

Step 1: Create a Protected Route Component#

We can create a component that checks if the user is authenticated and redirects them to a login page if they are not.

JavaScript

import React from 'react';
import { Route, Redirect } from 'react-router-dom';

const ProtectedRoute = ({ component: Component, isAuthenticated, ...rest }) => (
  <Route {...rest} render={(props) => (
    isAuthenticated === true
      ? <Component {...props} />
      : <Redirect to='/login' />
  )} />
);

export default ProtectedRoute;

In the above code, we are creating a component called ProtectedRoute. It takes in a component prop, which is the component that we want to protect. It also takes in an isAuthenticated prop, which is a boolean value that determines if the user is authenticated or not. The ...rest parameter spreads any additional props that we pass into the component.

We are using the Route component from react-router-dom to render our component. The render method takes in a function that returns the component if the user is authenticated or redirects them to the login page if they are not.

Step 2: Protect Your Routes#

We can now use our ProtectedRoute component to protect any routes that require authentication.

JavaScript

import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

import Home from './components/Home';
import Dashboard from './components/Dashboard';
import Login from './components/Login';
import ProtectedRoute from './components/ProtectedRoute';

const App = () => {
  const [isAuthenticated, setIsAuthenticated] = React.useState(false);

  return (
    <Router>
      <div className="App">
        <Switch>
          <Route exact path="/" component={Home} />
          <ProtectedRoute
            exact
            path="/dashboard"
            component={Dashboard}
            isAuthenticated={isAuthenticated}
          />
          <Route exact path="/login" render={(props) => (
            <Login {...props} setIsAuthenticated={setIsAuthenticated} />
          )} />
        </Switch>
      </div>
    </Router>
  );
}

export default App;

In the above code, we are protecting the /dashboard route by using our ProtectedRoute component. We are passing in the isAuthenticated prop, which is set to false by default.

We are also passing in the setIsAuthenticated prop to our Login component. This allows us to set the isAuthenticated state to true once the user has successfully logged in.

Step 3: Redirecting Users to Original URL#

If the user is redirected to the login page, we want to redirect them back to the original URL that they were trying to access after they have successfully logged in.

We can achieve this by storing the original URL in the session storage when the user is redirected to the login page. Once the user has successfully logged in, we can redirect them back to the original URL.

JavaScript

// Login component
const Login = ({ setIsAuthenticated, history }) => {
  const [username, setUsername] = React.useState('');
  const [password, setPassword] = React.useState('');

  const handleSubmit = (e) => {
    e.preventDefault();

    // Authenticate user
    setIsAuthenticated(true);

    // Get original URL from session storage
    const originalUrl = sessionStorage.getItem('originalUrl');

    // Redirect user to original URL
    if (originalUrl) {
      sessionStorage.removeItem('originalUrl');
      history.push(originalUrl);
    } else {
      history.push('/dashboard');
    }
  }

  return (
    <div className="login">
      <form onSubmit={handleSubmit}>
        <input type="text" placeholder="Username" value={username} onChange={(e) => setUsername(e.target.value)} />
        <input type="password" placeholder="Password" value={password} onChange={(e) => setPassword(e.target.value)} />
        <button type="submit">Login
      </form>
    </div>
  );
}

In the above code, we are getting the original URL from session storage using sessionStorage.getItem('originalUrl'). We are then removing the item from session storage using sessionStorage.removeItem('originalUrl') and redirecting the user back to the original URL using history.push(originalUrl).

We can store the original URL in session storage using sessionStorage.setItem('originalUrl', window.location.pathname) when the user is redirected to the login page.

Conclusion#

In this article, we looked at how to handle protected routes in React and redirect users to the original URL after they have successfully logged in. We used Higher Order Components (HOCs) to protect certain routes that require authentication and stored the original URL in session storage to redirect the user back to the original URL after they have successfully logged in.

Keep going

2023

how to sort an array

How to Sort an Array If you have an array and you want to order its elements in a specific way, you need to use a sorting algorithm. There are several sorting algorithms available, but two of the most commonly used are…

javascript2 min read
2023

jquery mobile or desktop

jQuery Mobile or Desktop? As a web developer, I have had some experience with both jQuery Mobile and jQuery Desktop. Both frameworks have their pros and cons, and which one to use really depends on the specific project…

javascript1 min read
2023

node.js folder structure

Node.js Folder Structure If you are new to Node.js, it can be daunting to create a folder structure that will work for your project. The structure you choose will depend on the size and complexity of your project. Here…

javascript1 min read
ESC