数据库JWT中不存在用户?

Posted

技术标签:

【中文标题】数据库JWT中不存在用户?【英文标题】:User not existend in the database JWT? 【发布时间】:2021-02-28 13:42:07 【问题描述】:

所以我在使用 JWT 令牌进行用户身份验证时遇到了一个小问题。当我登录时,它返回给我“用户不存在”,尽管数据库中显然有一个用户。我试图通过不在数据库中查找密码并进行比较来解决它并且它有效,但我的问题是我如何比较猫鼬数据库中的密码并检查用户是否存在?

登录路径:

//create route for sign in
router.post('/signin', async (req, res) => 
    //destructure email and password from req.body
    const user = await User.findOne(
        email: req.body.email,
        password: req.body.password,
    )
    if (!user) res.status(400).send( message: 'User doesnt exist' )
    else 
        const valid = compare(req.body.password, user.password)
        if (!valid) res.send(400).send( message: 'Password doesnt match' )

        if (valid) 
            const accesstoken = createAccessToken(user._id)
            const refreshtoken = createRefreshToken(user._id)
            return res.send(
            email: user.email,
            refreshtoken: user.refreshtoken,
            sendAccessToken: sendAccessToken(req, accesstoken),
            sendRefreshToken: sendRefreshToken(refreshtoken),
        )
        
    
)

用户模型:

const mongoose = require('mongoose')
// const SALT_WORK_FACTOR = 10
// const bcrypt = require('bcryptjs')

//how a user will be stored in the mongodb schema
const userSchema = new mongoose.Schema(
    name:  type: String, required: true, index:  unique: true  ,
    email:  type: String, required: true, unique: true, dropDups: true ,
    password:  type: String, required: true, minlength: 6, trim: true ,
    isAdmin:  type: Boolean, required: true, default: false ,
    refreshtoken:  type: String ,
)

const userModel = mongoose.model('Users', userSchema)

module.exports = userModel

登录页面:

import React,  useState, useEffect, useContext  from 'react'
import  userContext  from '../../App'
// import  useDispatch, useSelector  from 'react-redux'
// import  login  from '../../actions/userActions'

function Login(props) 
    const [email, setEmail] = useState('')
    const [password, setPassword] = useState('')
    const [user, setUser] = useContext(userContext)
    //acces the userLogin from redux store
    // const userLogin = useSelector((state) => state.userLogin)
    // const  loading, userInfo, error  = userLogin

    // const dipsatch = useDispatch()
    // useEffect(() => 
    //     if (userInfo) 
    //         props.history.push('/')
    //     
    // , [userInfo])

    //handlesubmit
    const handleSubmit = async (e) => 
        e.preventDefault()
        const result = await (
            await fetch('http://localhost:5000/users/signin', 
                method: 'POST',
                credentials: 'include',
                headers: 
                    'Content-Type': 'application/json',
                ,
                body: JSON.stringify(
                    email,
                    password,
                ),
            )
        ).json()
        if (result.accesstoken) 
            setUser(
                accesstoken: result.accesstoken,
            )
            window.location = '/'
         else 
            alert(result.error)
        
    
    useEffect(() => 
        console.log(user)
    , [user])

    return (
        <div>
            <h1 className="login-h">Login</h1>

            <form onSubmit=handleSubmit className="login">
                <div className="login-form">
                    <label>email</label>
                    <br />
                    <input
                        type="email"
                        placeholder="username or email"
                        for="email"
                        onChange=(e) => setEmail(e.target.value)
                    ></input>
                    <br />
                    <label>Password</label>
                    <br />
                    <input
                        type="password"
                        placeholder="Password"
                        for="password"
                        onChange=(e) => setPassword(e.target.value)
                    ></input>
                    <br />
                    <p className="forget-pw">
                        <a href="/">Forgot password?</a>
                    </p>
                    <button>Login</button> <br />
                    <br />
                    /* <p style= color: 'red' >result.error</p> */
                </div>
                <p className="have-ccl">
                    ' '
                    No account yet?<a href="/signup">Signup</a>
                </p>
            </form>
        </div>
    )


export default Login

【问题讨论】:

你甚至在散列你的密码吗? @Ifaruki 我没有散列我的密码? 好的,但是为什么您在查找查询中添加了passwords: req.body.password?您只需要email: req.body.email,然后检查用户是否存在,然后将哈希密码与普通密码与bcrypt.compare(如果使用bcrypt)进行比较 所以你已经发回了回复?您只能发回 1 条回复 您需要回复。使用res.send( ... ) 发送它,并将前端需要的所有信息放入该对象中 【参考方案1】:

有几个问题:

    从您的猫鼬查询中删除不必要的password: req.body.password 行。这基本上是将未散列的密码与纯 javascript 对象中的散列密码进行比较。这永远不会返回 true,因为哈希始终与未哈希的密码不同。 是否有可能您的身体从未真正被发送出去?您需要将name 属性添加到输入,然后才能对其进行解析。你在用body-parser吗?

【讨论】:

以上是关于数据库JWT中不存在用户?的主要内容,如果未能解决你的问题,请参考以下文章

如果标头中不存在 JWT 令牌,如何执行一些逻辑?

Symfony 的分析器中不存在 lexik_jwt_authentication.on_jwt_created

为啥即使数据库中不存在 id 和/或用户名我也会成功

使用 JWT 模块时出现错误“用户不存在错误”

Linux操作系统下oracle数据库中不存在scott用户的解决方案

仅当 Firebase Firestore 中不存在文档时才创建文档