«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Аутентификация с помощью Express JS и React JS Unsing JWT

Аутентификация с помощью Express JS и React JS Unsing JWT

Опубликовано 1 ноября 2024 г.
Просматривать:899

Authentication with express js and react js unsing jwt

Чтобы создать систему аутентификации с использованием React.js на внешнем интерфейсе и Express.js на внутреннем интерфейсе, нам необходимо реализовать следующее:

  • Фронтенд (React.js с 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' });
  }
};


Далее создайте основной файл server.js для настройки Express:


// 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.js и Pulsy для обработки состояния аутентификации.

Установите необходимые пакеты


npm install axios pulsy


Настройка магазина 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. Запустите экспресс-сервер:

   node server.js


  1. Запустите интерфейс React:

   npm start


После запуска обоих:

  • Вы можете посетить http://localhost:3000, чтобы увидеть страницу входа.
  • После входа в систему токен аутентификации будет сохранен, и вы будете перенаправлены на панель управления.
  • Если токен действителен, вы остаетесь в системе, в противном случае вы будете перенаправлены обратно на страницу входа.

Краткое содержание

В этом примере показано, как интегрировать Pulsy с системой аутентификации React, поддерживаемой API Express.js. 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