我的問題是我可以將所有登錄詳細資訊存盤在 MongoDB 中。當我登錄用戶時,我得到了令牌,但我不確定是否執行注銷功能。
登錄
router.post("/admin/sign_in", async (req, res) => {
try {
const { email, password } = req.body;
if (!(email && password)) {
res.status(400).send("All input is required");
}
const user = await User.findOne({ email });
if (user && (await bcrypt.compare(password, user.password))) {
const token = jwt.sign(
{ user_id: user._id, email },
process.env.TOKEN_KEY,
{
expiresIn: "15h",
}
);
user.token = token;
return res.status(200).json(user);
}
} catch (err) {
return res.status(400).send("Invalid Credentials");
}
});
module.exports = router;
驗證
const jwt = require("jsonwebtoken");
const config = process.env;
const authenticate = (req, res, next) => {
const token =
req.body.token || req.query.token || req.headers["autherization"];
if (!token) {
return res.status(403).send("A token is required for authentication");
}
try {
const decoded = jwt.verify(token, config.TOKEN_KEY);
req.user = decoded;
} catch (err) {
return res.status(401).send("Invalid Token");
}
return next();
};
module.exports = authenticate;
在這里,我的所有功能都可以正常作業,我需要一個想法來實作注銷功能
uj5u.com熱心網友回復:
讓我們看看用戶注銷時應該發生的最基本的事情是什么。
最基本的是 jwt-token 應該是無效的。因此,來自該無效令牌的所有新請求都應該在authenticate中間件處失敗。
現在,對于無效令牌的身份驗證功能失敗,它應該以某種方式確定令牌由于注銷而無效,而不是使用jwt.verify方法,因為jwt.verify在令牌過期之前不會失敗,但注銷可以在此之前發生。這就是為什么您需要某種持久存盤來確定令牌是否有效的原因。通常,使用 Redis 和 Memcached 等記憶體存盤。
這是您可以做的事情之一:
- 登錄時,將令牌存盤在 Redis 中。
- 在
authenticate函式中jwt.verify,您應該檢查該令牌是否存在于 Redis 中,然后才允許請求繼續。 - 注銷時,從 Redis 中洗掉令牌,這將確保所有帶有該令牌的傳入請求開始失敗。
對于更多方法,@Fabian Strathaus 評論中的答案鏈接也會給出一些很好的建議。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/526431.html
