You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

输入正确邮箱和密码仍无法登录的认证问题求助

登录失败排查与修复方案

问题概述

使用已注册的邮箱和密码尝试登录系统时始终失败,本地调试(VS Code)未发现代码错误,浏览器控制台也无报错信息。以下是关键代码:

前端登录组件(Entrar.js)

import { useEffect, useState } from 'react';
import { Link, useNavigate } from 'react-router-dom';
import styles from './Entrar.module.css';

const Entrar = () => {
  const navigate = useNavigate();

  useEffect(() => {
    const token = localStorage.getItem('token');
    if (token) {
      navigate('/');
    }
  }, [navigate]);

  const [dados, setDados] = useState({
    email: '',
    senha: '',
  });

  const [erro, setErro] = useState("");

  const handleMudar = ({ currentTarget: input }) => {
    setDados({ ...dados, [input.name]: input.value });
  };

  const handleEnviar = async (e) => {
    e.preventDefault();
    try {
      const url = 'http://localhost:5555/autenticar';
      const { data: resultado } = await axios.post(url, dados);
      localStorage.setItem('token', resultado.token);
      window.location = "/";
    } catch (erro) {
      if (
        erro.response && erro.response.status >= 400 &&
        erro.response.status <= 500
      ) {
        setErro(erro.response.data.message);
      }
    }
  }

  return (
    <div className={styles.entrar_container}>
      <div className={styles.entrar}>
        <div className={styles.left}>
          <form onSubmit={handleEnviar} className={styles.form}>
            <h1>Entrar</h1>
            <input
              type="email"
              placeholder="Email"
              name='email'
              onChange={handleMudar}
              value={dados.email}
              required
              className={styles.input}
            />
            <input
              type="password"
              placeholder="Senha"
              name='senha' // Changed to 'senha' from 'password'
              onChange={handleMudar}
              value={dados.senha}
              required
              className={styles.input}
            />
            {erro && <div className={styles.erro_msg}>{erro}</div>}
            <div className={styles.button_container}>
              <button type="submit" className={styles.entrar_btn}>
                Entrar
              </button>
              <Link to="/entrar/cadastrar">
              <button className={styles.novo_aqui_btn}>
                Novo Aqui?
              </button>
              </Link>
            </div>
          </form>
        </div>
      </div>
    </div>
  );
}

export default Entrar;

后端认证路由(autenticarRotas.js)

/* Importa os módulos necessários */
const express = require('express');
const { Usuario }  = require('../models/usuario');
const Joi = require('joi');
const bcrypt = require('bcrypt');

const autenticarRotas = express.Router();

autenticarRotas.post('/', async (request, response) => {
    try {
        const { error } = validar(request.body);
        if (error) 
                return response.status(400).send(error.details[0].message);
        
        /* Verifies if exist a user with the email */
        const usuario = await Usuario.findOne({ email: request.body.email });
        /* if doesn't exist returns a message */
        if (!usuario) 
                return response.status(400).send({ message: "Usuário não encontrado" });
        
        /* Verifies if the password or email is correct */
        const senhaValida = await bcrypt.compare(
            request.body.senha, usuario.senha
        );
        if (!senhaValida) 
                return response.status(400).send({ message: "Senha ou email incorreto" });

        const token = usuario.generateAuthToken();
        response.status(200).send({ dados: token, message: "Login efetuado com sucesso" });
    } catch (error) {
        return response.status(500).send({ message: "Erro interno do servidor (autetica rota)" });
    }
});

/* Cria um validação de dados usando joi*/
const validar = (dados) => {
    const schema = Joi.object({
        email: Joi.string().email().required().label("Email"),
        senha: Joi.string().required().label("Senha"),
    });
    return schema.validate(dados);
};

/* Exporta a route */
module.exports = autenticarRotas;

核心问题与修复方案

1. 前端未导入axios

代码中使用了axios.post但未导入axios模块,导致请求无法发起,且无报错提示(若未全局引入axios)。
修复:在Entrar.js顶部添加导入语句:

import axios from 'axios';

2. 前后端token字段不匹配

后端返回的token存储在dados字段中,前端却尝试读取resultado.token,导致无法获取并存储token,登录后跳转逻辑失效。
修复:修改前端存储token的代码:

// 原代码
// localStorage.setItem('token', resultado.token);
// 修改为
localStorage.setItem('token', resultado.dados);

3. 跳转方式不合理

使用window.location = "/"会强制刷新页面,不符合React单页应用的路由逻辑,且可能导致状态丢失。
修复:改用react-router的navigate方法:

// 原代码
// window.location = "/";
// 修改为
navigate('/');

4. 错误处理不完整

当前仅处理400-500状态码的响应错误,网络请求失败、跨域等场景无错误提示,难以排查问题。
修复:补充错误处理逻辑:

catch (erro) {
  if (
    erro.response && erro.response.status >= 400 &&
    erro.response.status <= 500
  ) {
    setErro(erro.response.data.message);
  } else {
    setErro("登录请求失败,请检查网络或查看控制台");
    console.error("登录错误详情:", erro); // 打印错误到控制台辅助排查
  }
}

5. 跨域问题排查

前端(通常端口3000)与后端(端口5555)端口不同,若未配置CORS,浏览器会拦截请求,部分场景下控制台无明显报错。
修复:后端安装并配置cors:

npm install cors

在后端主文件中添加:

const cors = require('cors');
app.use(cors());

内容的提问来源于stack exchange,提问作者programmerlearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:14:55