数据库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中不存在用户?的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 的分析器中不存在 lexik_jwt_authentication.on_jwt_created