Programming & Development / April 14, 2025

Token-Based Route Protection in React Using AuthProvider and Context API

React authentication AuthProvider JWT token-based auth React Router private route context API protected route login example logout localStorage

🔐 React Authentication with Token (Protected Routes using AuthProvider)

📦 Tech Stack:

React, JWT, React Router (v5 or v6), Context API

🧩 1. AuthProvider.jsAuthentication Context

jsx

import React, { createContext, useState, useContext, useEffect } from 'react';

const AuthContext = createContext();

export const AuthProvider = ({ children }) => {
  const [token, setToken] = useState(() => localStorage.getItem('token'));

  const login = (newToken) => {
    localStorage.setItem('token', newToken);
    setToken(newToken);
  };

  const logout = () => {
    localStorage.removeItem('token');
    setToken(null);
  };

  return (
    <AuthContext.Provider value={{ token, login, logout }}>
      {children}
    </AuthContext.Provider>
  );
};

export const useAuth = () => useContext(AuthContext);

🔐 2. PrivateRoute.jsProtecting Routes

✅ React Router v5

jsx

import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import { useAuth } from './AuthProvider';

const PrivateRoute = ({ component: Component, ...rest }) => {
  const { token } = useAuth();

  return (
    <Route
      {...rest}
      render={(props) =>
        token ? <Component {...props} /> : <Redirect to="/login" />
      }
    />
  );
};

export default PrivateRoute;

✅ React Router v6

jsx

import React from 'react';
import { Navigate } from 'react-router-dom';
import { useAuth } from './AuthProvider';

const PrivateRoute = ({ children }) => {
  const { token } = useAuth();
  return token ? children : <Navigate to="/login" />;
};

export default PrivateRoute;

🏠 3. App.jsRouting Setup

jsx

import React from 'react';
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import { AuthProvider } from './AuthProvider';
import Login from './Login';
import Home from './Home';
import PrivateRoute from './PrivateRoute';

function App() {
  return (
    <Router>
      <AuthProvider>
        <Routes>
          <Route path="/login" element={<Login />} />
          <Route
            path="/"
            element={
              <PrivateRoute>
                <Home />
              </PrivateRoute>
            }
          />
        </Routes>
      </AuthProvider>
    </Router>
  );
}

export default App;

🔑 4. Login.jsSimulating Token Login

jsx

import React from 'react';
import { useNavigate } from 'react-router-dom';
import { useAuth } from './AuthProvider';

const Login = () => {
  const { login } = useAuth();
  const navigate = useNavigate();

  const handleLogin = () => {
    // Normally you'd call your backend for a token
    const fakeToken = 'abc123token';
    login(fakeToken);
    navigate('/');
  };

  return (
    <div>
      <h2>Login Page</h2>
      <button onClick={handleLogin}>Login</button>
    </div>
  );
};

export default Login;

✅ 5. Home.jsProtected Component

jsx

import React from 'react';
import { useAuth } from './AuthProvider';

const Home = () => {
  const { logout } = useAuth();

  return (
    <div>
      <h2>Welcome to the Home Page!</h2>
      <button onClick={logout}>Logout</button>
    </div>
  );
};

export default Home;

💡 Bonus Tips:

  • ✅ You can enhance this by checking token expiry and decoding JWT.
  • 🔐 For role-based protection, store roles inside the token or context.
  • 🔁 Add a refresh token mechanism for better UX.



Comments

No comments yet

Add a new Comment

NUHMAN.COM

Information Technology website for Programming & Development, Web Design & UX/UI, Startups & Innovation, Gadgets & Consumer Tech, Cloud Computing & Enterprise Tech, Cybersecurity, Artificial Intelligence (AI) & Machine Learning (ML), Gaming Technology, Mobile Development, Tech News & Trends, Open Source & Linux, Data Science & Analytics

Categories

Tags

©{" "} Nuhmans.com . All Rights Reserved. Designed by{" "} HTML Codex