」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用express js和react js unsing jwt進行身份驗證

使用express js和react js unsing jwt進行身份驗證

發佈於2024-11-01
瀏覽:444

Authentication with express js and react js unsing jwt

要在前端使用 React.js、在后端使用 Express.js 创建身份验证系统,我们需要实现以下内容:

  • 前端(React.js with Pulsy):处理登录和注销,维护用户身份验证状态,并保留令牌。
  • 后端 (Express.js):提供身份验证端点(例如登录、注销、用户验证)。

第 1 步:后端 (Express.js) 设置

让我们从后端开始处理用户身份验证和令牌生成。

安装所需的软件包


npm install express bcryptjs jsonwebtoken cors


后端代码 (Express.js)

创建 authController.js 文件来处理身份验证逻辑:


// authController.js
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');

// Mock user data (in production, you would use a real database)
const users = [
  {
    id: 1,
    username: 'john',
    password: '$2a$10$O1s8iLKRLPbPqhc1uTquLO.xODTC1U/Z8xGoEDU6/Dc0PAQ3MkCKy', // hashed password for 'password123'
  },
];

// JWT Secret
const JWT_SECRET = 'supersecretkey';

exports.login = (req, res) => {
  const { username, password } = req.body;

  const user = users.find((u) => u.username === username);

  if (!user) {
    return res.status(401).json({ error: 'Invalid credentials' });
  }

  bcrypt.compare(password, user.password, (err, isMatch) => {
    if (isMatch) {
      // Create a token
      const token = jwt.sign({ id: user.id, username: user.username }, JWT_SECRET, { expiresIn: '1h' });
      return res.json({ token });
    } else {
      return res.status(401).json({ error: 'Invalid credentials' });
    }
  });
};

exports.validateToken = (req, res) => {
  const token = req.header('Authorization').replace('Bearer ', '');

  if (!token) {
    return res.status(401).json({ error: 'No token provided' });
  }

  try {
    const decoded = jwt.verify(token, JWT_SECRET);
    res.json({ user: { id: decoded.id, username: decoded.username } });
  } catch (err) {
    res.status(401).json({ error: 'Invalid token' });
  }
};


接下来,创建用于设置 Express 的主 server.js 文件:


// server.js
const express = require('express');
const cors = require('cors');
const { login, validateToken } = require('./authController');

const app = express();
app.use(express.json());
app.use(cors());

// Authentication routes
app.post('/api/login', login);
app.get('/api/validate', validateToken);

// Start the server
const PORT = 5000;
app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});


  • POST /api/login:对用户进行身份验证并返回 JWT 令牌。
  • GET /api/validate:验证令牌并返回用户信息。

第 2 步:前端(React.js 和 Pulsy)

现在让我们使用 React.jsPulsy 设置前端来处理身份验证状态。

安装所需的软件包


npm install axios pulsy


脉冲商店设置

我们将创建一个 Pulsy 商店来管理全球身份验证状态。


// authStore.js
import { createStore, addMiddleware } from 'pulsy';
import axios from 'axios';

// Create a store to hold the user and token
createStore('auth', {
  user: null,
  token: null,
}, { persist: true }); // Persist the auth state in localStorage

// Middleware to add Authorization header for authenticated requests
addMiddleware('auth', (nextValue, prevValue, storeName) => {
  if (nextValue.token) {
    axios.defaults.headers.common['Authorization'] = `Bearer ${nextValue.token}`;
  } else {
    delete axios.defaults.headers.common['Authorization'];
  }
  return nextValue;
});


此存储将保留身份验证状态(用户和令牌)并自动为经过身份验证的请求应用授权标头。

认证功能

创建辅助函数来处理登录和验证请求:


// authService.js
import { setStoreValue } from 'pulsy';
import axios from 'axios';

const API_URL = 'http://localhost:5000/api';

export const login = async (username, password) => {
  try {
    const response = await axios.post(`${API_URL}/login`, { username, password });
    const { token } = response.data;

    // Set token and user info in Pulsy store
    setStoreValue('auth', { token, user: { username } });

    return true;
  } catch (error) {
    console.error('Login failed', error);
    return false;
  }
};

export const validateToken = async () => {
  try {
    const response = await axios.get(`${API_URL}/validate`);
    const user = response.data.user;

    // Update the store with the user info
    setStoreValue('auth', { user, token: localStorage.getItem('auth_token') });
    return true;
  } catch (error) {
    console.error('Token validation failed', error);
    return false;
  }
};

export const logout = () => {
  setStoreValue('auth', { user: null, token: null });
  localStorage.removeItem('pulsy_auth');
};


第3步:创建身份验证组件

现在让我们为登录和经过身份验证的视图创建 React 组件。

登录组件


// Login.js
import React, { useState } from 'react';
import { login } from './authService';

const Login = () => {
  const [username, setUsername] = useState('');
  const [password, setPassword] = useState('');
  const [error, setError] = useState('');

  const handleLogin = async (e) => {
    e.preventDefault();
    const success = await login(username, password);
    if (!success) {
      setError('Invalid credentials. Try again.');
    }
  };

  return (
    

Login

setUsername(e.target.value)} placeholder="Username" required /> setPassword(e.target.value)} placeholder="Password" required />
{error &&

{error}

}
); }; export default Login;

已验证组件


// Dashboard.js
import React from 'react';
import { usePulsy } from 'pulsy';
import { logout } from './authService';

const Dashboard = () => {
  const [auth] = usePulsy('auth');

  const handleLogout = () => {
    logout();
    window.location.reload(); // Simple page refresh to redirect to login
  };

  return (
    

Welcome, {auth.user.username}!

); }; export default Dashboard;

第 4 步:应用程序组件

在 App.js 组件中,您需要检查用户是否经过身份验证并有条件地呈现登录名或仪表板。


// App.js
import React, { useEffect } from 'react';
import { usePulsy } from 'pulsy';
import { validateToken } from './authService';
import Login from './Login';
import Dashboard from './Dashboard';

function App() {
  const [auth] = usePulsy('auth');

  useEffect(() => {
    // Check token validity on app load
    if (auth.token) {
      validateToken();
    }
  }, [auth.token]);

  return (
    
{auth.user ? : }
); } export default App;

第 5 步:运行应用程序

现在我们已经设置了后端前端,您可以运行该应用程序了。

  1. 启动 Express 服务器:

   node server.js


  1. 启动React前端:

   npm start


两者都运行后:

  • 您可以访问http://localhost:3000查看登录页面。
  • 登录后,身份验证令牌将被保存,您将被重定向到仪表板。
  • 如果令牌有效,您将保持登录状态,否则,您将被重定向回登录页面。

概括

此示例展示了如何将 Pulsy 与 Express.js API 支持的 React 身份验证系统集成。 Pulsy 可帮助您管理身份验证的全局状态,包括身份验证令牌和跨会话的用户数据的持久性,使其成为功能强大且易于使用的状态管理工具。

版本聲明 本文轉載於:https://dev.to/ng_dream_3e53e6a868268e4d/authentication-with-express-js-and-react-js-unsing-jwt-4nbp?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3