我已使用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令牌无效
您可以通过多种方式实现。在这里,我将解释几种方法
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();
});