"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Autenticação com express js e react js unsing jwt

Autenticação com express js e react js unsing jwt

Publicado em 01/11/2024
Navegar:570

Authentication with express js and react js unsing jwt

Para criar um sistema de autenticação usando React.js no frontend, Express.js no backend, precisamos implementar o seguinte:

  • Frontend (React.js com Pulsy): processa login e logout, mantém o estado de autenticação do usuário e persiste tokens.
  • Backend (Express.js): fornece pontos de extremidade de autenticação (por exemplo, login, logout, validação de usuário).

Etapa 1: configuração de back-end (Express.js)

Vamos começar com o back-end para lidar com a autenticação do usuário e a geração de tokens.

Instale os pacotes necessários


npm install express bcryptjs jsonwebtoken cors


Código de back-end (Express.js)

Crie um arquivo authController.js para lidar com a lógica de autenticação:


// 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' });
  }
};


Em seguida, crie o arquivo server.js principal para configurar o 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: autentica um usuário e retorna um token JWT.
  • GET /api/validate: valida um token e retorna as informações do usuário.

Etapa 2: Front-end (React.js com Pulsy)

Agora vamos configurar o frontend usando React.js e Pulsy para lidar com o estado de autenticação.

Instale os pacotes necessários


npm install axios pulsy


Configuração da loja Pulsy

Criaremos uma loja Pulsy para gerenciar o estado de autenticação globalmente.


// 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;
});


Este armazenamento persistirá o estado de autenticação (usuário e token) e aplicará automaticamente o cabeçalho Authorization para solicitações autenticadas.

Funções de autenticação

Crie funções auxiliares para lidar com solicitações de login e validação:


// 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');
};


Etapa 3: criar componentes de autenticação

Agora vamos criar os componentes React para login e visualizações autenticadas.

Componente de login


// 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;

Componente Autenticado


// 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;

Etapa 4: componente do aplicativo

No componente App.js, você desejará verificar se o usuário está autenticado e renderizar condicionalmente o login ou o painel.


// 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;

Etapa 5: execute o aplicativo

Agora que temos o backend e o frontend configurados, você pode executar o aplicativo.

  1. Iniciar o servidor Express:

   node server.js


  1. Inicie a interface do React:

   npm start


Quando ambos estiverem em execução:

  • Você pode visitar http://localhost:3000 para ver a página de login.
  • Após fazer login, o token de autenticação será salvo e você será redirecionado para o painel.
  • Se o token for válido, você permanecerá logado, caso contrário, será redirecionado de volta para a página de login.

Resumo

Este exemplo mostra como integrar Pulsy com um sistema de autenticação React apoiado por uma API Express.js. Pulsy ajuda você a gerenciar o estado global para autenticação, incluindo a persistência do token de autenticação e dos dados do usuário entre sessões, tornando-o uma ferramenta de gerenciamento de estado poderosa e fácil de usar.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/ng_dream_3e53e6a868268e4d/authentication-with-express-js-and-react-js-unsing-jwt-4nbp?1 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3