当我注销时,我无法使用相同的电子邮件和密码登录,显示错误 jwt
Posted
技术标签:
【中文标题】当我注销时,我无法使用相同的电子邮件和密码登录,显示错误 jwt【英文标题】:When i am logout then i cannot login with same email & password, showing me error jwt 【发布时间】:2021-04-18 22:57:37 【问题描述】:*我可以创建新帐户,也可以登录,但是当我要注销时,我会注销,但是如果我尝试使用相同的电子邮件和密码登录,但我无法登录,则会显示 jsonwebtoken 错误-> "name":"JsonWebTokenError","message":"jwt 必须提供" * register.js 这是我的 register.js 文件代码
app.get("/register", (req, res) =>
// res.send('Hello Arunesh')
res.render("register");
);
app.post("/register", async (req, res) =>
try
const password = req.body.password;
const cPassword = req.body.cPassword;
if (password === cPassword)
const registerData = new Register(
firstName: req.body.firstName,
lastName: req.body.lastName,
phone: req.body.phone,
gender: req.body.gender,
email: req.body.email,
age: req.body.age,
password: req.body.password,
confirmPassword: req.body.cPassword,
);
const token = await registerData.generateAuthToken();
console.log('Register Token : ',token);
res.cookie('jwt', token,
httpOnly:true
)
const register = await registerData.save();
console.log(register);
res.status(201).render("index");
else
res.send("Password are not match");
catch (e)
res.status(400).send(e);
);
login.js
app.get("/login", (req, res) =>
res.render("login");
);
app.post("/login", auth,async (req, res) =>
try
const email = req.body.email;
const password = req.body.password;
const userEmail = await Register.findOne( email: email );
const isMatch = await bcrypt.compare(password, userEmail.password);
const token = await userEmail.generateAuthToken();
res.cookie('jwt', token,
expires:new Date(Date.now()+30000000),
httpOnly:true
)
console.log('Login Token : ',token);
console.log(isMatch);
if (isMatch)
res.status(201).render("index");
else
res.send("Invalid password or email");
catch (e)
res.status(400).send(e);
);
Logout.js
app.get('/logout', auth,async (req, res)=>
try
// console.log(req.user);
// Logout for single user
req.user.tokens = req.user.tokens.filter((authToken)=>
return authToken.token != req.token;
)
// logout from all device
// req.user.tokens = [];
res.clearCookie("jwt");
await req.user.save();
res.render('login');
catch(e)
console.log(e);
)
auth.js
const jwt = require('jsonwebtoken');
const Register = require('../models/registers');
const auth = async (req, res, next)=>
try
const token = req.cookies.jwt;
const verifyUser = jwt.verify(token, process.env.SECRET_KEY);
const user = await Register.findOne(_id:verifyUser._id, 'tokens.token':token)
req.token = token;
req.user = user;
next()
catch(e)
res.send(e)
module.exports = auth;
** 生成AuthToken **
registerSchema.methods.generateAuthToken = async function ()
try
const token = jwt.sign( _id: this._id.toString() ,process.env.SECRET_KEY);
this.tokens = this.tokens.concat(token:token)
await this.save();
return token;
catch (e)
console.log(e);
;
** 架构 **
const mongoose = require("mongoose");
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const registerSchema = new mongoose.Schema(
firstName:
type: String,
required: true,
,
lastName:
type: String,
required: true,
,
phone:
type: Number,
required: true,
unique: true,
,
gender:
type: String,
required: true,
,
email:
type: String,
required: true,
unique: true,
,
age:
type: Number,
required: true,
,
password:
type: String,
required: true,
,
confirmPassword:
type: String,
required: true,
,
tokens: [
token:
type: String,
required: true,
,
,
],
);
/********************************************
* Generate Token
********************************************/
registerSchema.methods.generateAuthToken = async function ()
try
const token = jwt.sign( _id: this._id.toString() ,process.env.SECRET_KEY);
this.tokens = this.tokens.concat(token:token)
await this.save();
return token;
catch (e)
console.log(e);
;
/********************************************
* Password Hash
********************************************/
registerSchema.pre("save", async function (next)
if (this.isModified("password"))
this.password = await bcrypt.hash(this.password, 10);
this.confirmPassword = await bcrypt.hash(this.password, 10);
next();
);
const Register = new mongoose.model("Register", registerSchema);
module.exports = Register;
【问题讨论】:
添加了你的模型,给我看 generateAuthToken registerSchema.methods.generateAuthToken = async function () try const token = jwt.sign( _id: this._id.toString() ,process.env.SECRET_KEY); this.tokens = this.tokens.concat(token:token) 等待 this.save();返回令牌; 捕捉 (e) 控制台.log(e); ; 将您的架构完全添加到您的问题中 我只添加了一次检查 是的,到时候它也会从集合和 cookie 中删除 【参考方案1】:你在/login
路由中使用了auth
中间件,当传入的令牌为空或为空时会发生此错误,像这样从路由中删除auth中间件,我希望我的回答能解决问题
app.post("/login" , async (req, res) => ...
【讨论】:
终于在你的帮助下解决了,谢谢兄弟? 如果您的问题解决了,请接受我的回答并为兄弟点赞:)以上是关于当我注销时,我无法使用相同的电子邮件和密码登录,显示错误 jwt的主要内容,如果未能解决你的问题,请参考以下文章
iOS:无法注销 Facebook 用户并再次要求输入电子邮件和密码
Graphql Mutation 更新用户数据,但更改密码,注销后无法登录