繁体   English   中英

无法连接到后端到 nodejs 和 MongoDB

[英]Unable to connect to Backend to nodejs and MongoDB

当我从前端提供有效凭据时,我无法连接到后端 我遇到此错误:POST http://127.0.0.1:5000/api/login 400(错误请求)我能够从后端生成令牌结束,但无法从 Fornt-end 登录并获得无效凭据,尽管我给出的是这样的:{ "email": "Sandi6008@gmail.com", "password":14280 }

这是我的后端代码 Nodejs 代码:

router.post('/login', async(req,res) =>{
    try {
        const {email,password} =req.body;
         let exist = await Auth.findOne({email}) 
         if(!exist){
             return res.status(400).json("User Not Found");
         }
         if(exist.password !== password){ 
          return res.status(400).json('Invalid Credentails');
         }
            let payload = {
                user : {
                    id  : exist.id
                }
            }
            jwt.sign(payload,'jwtSecret',{expiresIn : 3600000}, (err,token)=>
                if (err) throw err;
                return res.json({token})
            })
    } catch (error) {
        res.status(500).json({error : error.msg})
    }
})

这是 MongoDB 架构

const mongoose = require('mongoose');



const AuthSchema =  new mongoose.Schema({
    username :{
        type : String,
        required : true
    },
    email :{
        type : String,
        required : true,
        unique : true
    },
    password :{
        type : Number,
        required : true
    },
    confirmpassword :{
        type : Number,
        required : true
    },
    created :{
        type : Date,
        default : Date.now()
    }
});

let Auth = mongoose.model('auth' , AuthSchema);
module.exports = Auth;

这是 Forntend 登录页面

import React,{useState,useContext} from 'react'
import axios from "axios";
import { store } from './../../App';
import { Navigate } from 'react-router-dom';

 const Login = () => {

    const [data, setData] = useState({
        email : '',
        password : '',
     })

     const handleChange = (e) =>{
         setData({...data,[e.target.name] : e.target.value});
     }

     const submitForm =(e) =>{
          e.preventDefault();
         //console.log(data);
         axios.post('http://127.0.0.1:5000/api/login',data).then(res => console.log(res.data));
     }

  return (
    <div>
    <div className="container mt-3">
      <div className="row">
        <div className="col-md-4">
          <div className="card">
            <div className="card-header bg-info text-white">
              <h4>Login</h4>
              <hr className="bg-white border-3 border-top border-white"></hr>
              <form onSubmit={submitForm}>
                <div className="form-group mt-2">
                <label htmlFor="exampleInputEmail1" className="form-label fw-bold">Email</label>
                  <input name="email" className="form-control" placeholder='Email' onChange={handleChange} />
                </div>
                <div className="form-group mt-2">
                <label htmlFor="exampleInputEmail1" className="form-label fw-bold">Passowrd</label>
                  <input type="text" className="form-control" placeholder='Passowrd' name="Passowrd" onChange={handleChange} />
                </div>
                <button type="submit" className="btn btn-dark fw-bold mt-4">Submit</button>
              </form>
            </div>
          </div>
        </div>
      </div>
      </div>
</div>
  )
}

export default Login

这是注册码 这里是注册码

router.post('/register', async(req,res) =>{
   try {
       const {username,email,password,confirmpassword} = req.body;
       //First we need to check wheather is the Email Id is exists or not?
       let exist = await Auth.findOne({email});
       if(exist){
           return res.status(400).json({msg : 'User is alreday exists'});
       }
       if(password !== confirmpassword){
        return res.status(400).json({msg : 'Passwords are not matching'});
       }

        let newUser = new Auth({
            username,
            email,
            password,
            confirmpassword
        })
         await newUser.save();
         res.status(200).send({msg : 'Register Successfully'})
   } catch (error) {
       res.status(500).json({error : error.msg})
   }         

})

该错误可能是由比较期间不同类型的密码引起的,因为您将它们存储为Number 尝试使用.toString()将它们都转换为字符串:

if(exist.password.toString() !== password.toString()) { 
    return res.status(400).json('Invalid Credentails');
}

另外,我看到您以纯文本格式保存密码,这是一个非常糟糕的安全问题。 查看一些允许您 hash 存储密码的库,例如bcrypt

您的注册代码将变为:

// Generate encrypted password
const salt = await bcrypt.genSalt(12);
const encryptedPassword = await bcrypt.hash(password, salt);

let newUser = new Auth({
    username,
    email,
    password: encryptedPassword,
    confirmpassword: encryptedPassword
});

您将在登录期间检查您的密码:

const isValidPsw = await bcrypt.compare(password, exist.password);
if (!isValidPsw) {
    return res.status(400).json('Invalid Credentails');
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM