如何在节点后端使用jwt令牌注销

问题描述 投票:0回答:1

我已使用jwt令牌登录

const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET);

下面是我的路由器代码


router.post("/login", async (req, res) => {
    try {
        const { email, password } = req.body;

        // validate
        if (!email || !password)
            return res.status(400).json({ msg: "Not all fields have been entered." });

        const user = await Customer.findOne({ email: email });
        if (!user)
            return res
                .status(400)
                .json({ msg: "No account with this email has been registered." });

        const isMatch = await bcrypt.compare(password, user.password);
        if (!isMatch) return res.status(400).json({ msg: "Invalid credentials." });

        const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET);
        res.json({
            token,
            user: {
                id: user._id,
                displayName: user.displayName,
            },
        });
    } catch (err) {
        res.status(500).json({ error: err.message });
    }
});

任何人都可以提供使用jwt令牌注销的代码

jwt backend logout
1个回答
0
投票

您只需要在注销时使jwt令牌无效

您可以通过多种方式实现。在这里,我将解释几种方法

1。在数组中存储令牌。在注销时,您可以删除令牌

const refreshTokens = []; --> global declaration

登录时,res.json({...});之前

refreshTokens.push(refreshToken);

这里的约束是jwt令牌是有时间限制的。如果旧令牌过期,则需要获取刷新令牌。每当您发出刷新令牌时,都需要删除旧令牌并推送最新的

router.post('/refreshtoken', function (req, res) { 

  const { token } = req.body;

if (!token) {
    return res.sendStatus(401);
}

if (!refreshTokens.includes(token)) {
    return res.sendStatus(403);
}

jwt.verify(token, refreshTokenSecret, (err, user) => {
    if (err) {
        return res.sendStatus(403);
    }

    const accessToken = jwt.sign({ username: user.username, role: user.role }, accessTokenSecret, { expiresIn: '20m' });
    refreshTokens = refreshTokens.filter(token => t !== token);
    refreshTokens.push(accessToken);

    res.json({
        accessToken
     });
  });
 });

在注销中,您需要使令牌无效

 app.post('/logout', (req, res) => {
    const { token } = req.body;
    refreshTokens = refreshTokens.filter(token => t !== token);

    res.send("Logout successful");
 });

2。每当您登录或重新发行令牌时,将令牌存储在cookie中。从cookie验证jwt令牌,而不是从标头中读取。

res.cookie('jwt_token', token, {
    expires: new Date(Date.now() + expiration),
    secure: false, // set to true if your using https
    httpOnly: true,
  });

注销时销毁cookie

router.get('/logout', function (req, res) { 
  res.clearCookie('jwt_token');
  req.session.destroy(); 
});
© www.soinside.com 2019 - 2024. All rights reserved.