احراز هویت JWT با NodeJS
  یک سیستم احراز هویت سفارشی با Node.js و JWT ایجاد کنید
احراز هویت برای برنامه های کاربردی وب مدرن ضروری است. در این آموزش، یک سیستم احراز هویت سفارشی با استفاده از آن می سازیم Node.js، JWT، و واکنش نشان دهید. شما یاد خواهید گرفت که چگونه ثبت نام و ورود کاربر ایمن را راه اندازی کنید، وضعیت های احراز هویت را مدیریت کنید، و انقضای رمز را با توکن های تازه سازی مدیریت کنید.
  پیش نیازها
قبل از شروع، اطمینان حاصل کنید که:
- Node.js بر روی سیستم شما نصب شده است.
 - درک اولیه از واکنش نشان دهید، Node.js، و جاوا اسکریپت.
 - یک ویرایشگر کد مانند کد VS.
 
  مرحله 1: Backend را تنظیم کنید
با ایجاد backend برای مدیریت احراز هویت کاربر شروع کنید.
  1.1 پروژه را راه اندازی کنید
mkdir node-jwt-auth
cd node-jwt-auth
npm init -y
  1.2 کتابخانه های مورد نیاز را نصب کنید
npm install express jsonwebtoken bcrypt cors
  مرحله 2: Backend را پیاده سازی کنید
  2.1 سرور را ایجاد کنید
یک فایل به نام ایجاد کنید server.js در ریشه پروژه:
const express = require("express");
const jwt = require("jsonwebtoken");
const bcrypt = require("bcrypt");
const cors = require("cors");
const app = express();
app.use(express.json()); // Built-in middleware to parse JSON requests
app.use(cors());
// Mock user database
const users = [];
// JWT secret keys
const ACCESS_TOKEN_SECRET = "your_access_token_secret";
const REFRESH_TOKEN_SECRET = "your_refresh_token_secret";
// Refresh token storage
let refreshTokens = [];
// User registration endpoint
app.post("/register", async (req, res) => {
  const { username, password } = req.body;
  // Check if user already exists
  if (users.find((user) => user.username === username)) {
    return res.status(400).json({ error: "User already exists" });
  }
  // Hash the password
  const hashedPassword = await bcrypt.hash(password, 10);
  // Save user
  users.push({ username, password: hashedPassword });
  res.status(201).json({ message: "User registered successfully" });
});
// User login endpoint
app.post("/login", async (req, res) => {
  const { username, password } = req.body;
  // Find user
  const user = users.find((user) => user.username === username);
  if (!user || !(await bcrypt.compare(password, user.password))) {
    return res.status(400).json({ error: "Invalid username or password" });
  }
  // Generate tokens
  const accessToken = jwt.sign({ username }, ACCESS_TOKEN_SECRET, {
    expiresIn: "15m",
  });
  const refreshToken = jwt.sign({ username }, REFRESH_TOKEN_SECRET);
  refreshTokens.push(refreshToken); // Store refresh token
  res.json({ accessToken, refreshToken });
});
// Refresh token endpoint
app.post("/token", (req, res) => {
  const { token } = req.body;
  if (!token || !refreshTokens.includes(token)) {
    return res.status(403).json({ error: "Invalid refresh token" });
  }
  try {
    const user = jwt.verify(token, REFRESH_TOKEN_SECRET);
    const accessToken = jwt.sign(
      { username: user.username },
      ACCESS_TOKEN_SECRET,
      {
        expiresIn: "15m",
      }
    );
    res.json({ accessToken });
  } catch {
    res.status(403).json({ error: "Invalid token" });
  }
});
// Logout endpoint
app.post("/logout", (req, res) => {
  const { token } = req.body;
  refreshTokens = refreshTokens.filter((t) => t !== token);
  res.status(200).json({ message: "Logged out successfully" });
});
// Protected route
app.get("/protected", (req, res) => {
  const authHeader = req.headers.authorization;
  const token = authHeader && authHeader.split(" ")[1];
  if (!token) return res.status(401).json({ error: "Unauthorized" });
  try {
    const decoded = jwt.verify(token, ACCESS_TOKEN_SECRET);
    res.json({ message: "Welcome to the protected route!", user: decoded });
  } catch {
    res.status(403).json({ error: "Invalid or expired token" });
  }
});
// Start the server
app.listen(3001, () => {
  console.log("Server running on http://localhost:3001");
});
  مرحله 3: Frontend را تنظیم کنید
  3.1 برنامه React را راه اندازی کنید
npx create-react-app client
cd client
npm install axios
  مرحله 4: React Components را ایجاد کنید
  4.1 ایجاد کنید AuthContext
در داخل src پوشه، یک فایل جدید ایجاد کنید AuthContext.js:
import React, { createContext, useState, useContext } from "react";
import axios from "axios";
const AuthContext = createContext();
export const AuthProvider = ({ children }) => {
  const [user, setUser] = useState(null);
  const login = async (username, password) => {
    try {
      const { data } = await axios.post("http://localhost:3001/login", {
        username,
        password,
      });
      localStorage.setItem("accessToken", data.accessToken);
      localStorage.setItem("refreshToken", data.refreshToken);
      setUser({ username });
    } catch (err) {
      console.error(err);
      alert("Invalid credentials");
    }
  };
  const logout = async () => {
    const refreshToken = localStorage.getItem("refreshToken");
    await axios.post("http://localhost:3001/logout", { token: refreshToken });
    localStorage.removeItem("accessToken");
    localStorage.removeItem("refreshToken");
    setUser(null);
  };
  return (
    <AuthContext.Provider value={{ user, login, logout }}>
      {children}
    </AuthContext.Provider>
  );
};
export const useAuth = () => useContext(AuthContext);
  4.2 ورود به سیستم و اجزای محافظت شده ایجاد کنید
  کامپوننت ورود
import React, { useState } from "react";
import { useAuth } from "./AuthContext";
const Login = () => {
  const { login } = useAuth();
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");
  return (
    <div>
      <h1>Login</h1>
      <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 onClick={() => login(username, password)}>Login</button>
    </div>
  );
};
export default Login;
  جزء محافظت شده
import React, { useEffect, useState } from "react";
import axios from "axios";
const Protected = () => {
  const [message, setMessage] = useState("");
  useEffect(() => {
    const fetchData = async () => {
      try {
        const token = localStorage.getItem("accessToken");
        const { data } = await axios.get("http://localhost:3001/protected", {
          headers: { Authorization: `Bearer ${token}` },
        });
        setMessage(data.message);
      } catch {
        setMessage("Unauthorized");
      }
    };
    fetchData();
  }, []);
  return <div>{message}</div>;
};
export default Protected;
  مرحله 5: برنامه را اجرا کنید
- سرور باطن را راه اندازی کنید:
 
   node server.js
- React frontend را راه اندازی کنید:
 
   npm start
  افکار نهایی
تبریک می گویم! شما یک سیستم احراز هویت امن با Node.js، JWT و React ساختهاید. برای آموزش های بیشتر به من مراجعه کنید کانال یوتیوب.



