当我注销时,我无法使用相同的电子邮件和密码登录,显示错误 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 用户并再次要求输入电子邮件和密码

MVC 在同一用户登录后注销所有活动会话

Graphql Mutation 更新用户数据,但更改密码,注销后无法登录

Firebase 更改 Facebook 帐户

错误:Firebase Auth Google 删除 EmailPassword Auth

带有 LDAP 注销的 Spring Security 无法删除会话