NodeJS 我将JWT令牌Cookie存储在中,但它不起作用

k10s72fa  于 2023-04-05  发布在  Node.js
关注(0)|答案(1)|浏览(157)

//登录用户和认证用户
exports.userLogin = async(req,res)=〉{ const { email,password } = req.body;

try {
  const user = await User.findOne({ email: email }).select('+password');
  if (!user) {
    return res.status(404).json({ message: "Invalid Email" });
  } 
  else if (user.password !== password) 
  {
    return res.status(404).json({ message: "Invalid password" });
  }
   else {
    const token = user.getJwtToken()
    const options = 
    {
        expires:new Date(Date.now()+process.env.COOKIE_EXPIRES_TIME*24*60*60*1000),
        httpOnly:true,
        Secure:true
    }
    res.status(201).cookie('token',token,options).json({
      token: token,
      user:user
    });
  }
} catch (err) {
  console.log("something went wrong: " + err.message);
}

};
我在cookie中存储令牌,但它不工作,我检查cookie中的令牌是否为空

aydmsdu9

aydmsdu91#

我在系统中使用jsonwebtokenexpress尝试了上面的场景,并且能够在响应头中看到cookie。也许问题出在第11行的方法user.getJwtToken()上。如果您在第11行下面添加一个日志并检查token的值是否得到任何值,那就太好了。
尝试了下面的,它工作得很好。

const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();

const start = (port) => {
    try {
        app.listen(port, () => {
            console.log(`Api up and running at: http://localhost:${port}`);
        });
    } catch (error) {
        console.error(error);
        process.exit();
    }
};

start(3333);

app.get('/login', (req, res) => {
    const token = jwt.sign({ id: 7, role: 'captain' }, 'TEST_JWT');
    return res
        .status(201)
        .cookie('token', token, {
            expires: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000),
            httpOnly: true,
            secure: true,
        })
        .json({ message: 'Logged in successfully!!!' });
});

此外,不建议在电子邮件不存在时显示Invalid Email,在密码不匹配时显示Invalid Password,因为无论特定用户是否正在使用应用程序,都可能导致安全问题。因此,当上述任何一种情况为true时,最好使用类似Invalid Email or Password的东西。

if (!user || user.password !== password) {
    return res.status(404).json({ message: "Invalid Email or Password" });
}

相关问题