Authentication 如何使用JWT注销

Authentication 如何使用JWT注销,authentication,jwt,authorization,logout,Authentication,Jwt,Authorization,Logout,我正在使用JWT进行身份验证和授权。但我不知道在注销路径中写什么。我已经搜索了很多,但无法得到什么填写注销路线。这是我的密码。请帮忙 const jwt=require("jsonwebtoken"); const jwtKey="My_admin_is_safe"; app.get('/admin',(req,res)=>{ res.render('LoginAdmin',{erru:"",errp:""})

我正在使用JWT进行身份验证和授权。但我不知道在注销路径中写什么。我已经搜索了很多,但无法得到什么填写注销路线。这是我的密码。请帮忙

const jwt=require("jsonwebtoken");
const jwtKey="My_admin_is_safe";
app.get('/admin',(req,res)=>{
res.render('LoginAdmin',{erru:"",errp:""});
 });

 app.post('/admin/login',(req,res)=>{
  Admin.findOne({username:req.body.id},(function(err,result){
    if(!result)
        res.render('LoginAdmin',{erru:"Username not found",errp:""});
    else if(!passwordHash.verify(req.body.password,result.password))
        res.render('LoginAdmin',{erru:"",errp:"Incorrect Password"});
    else 
        {   const user=result.username;
            const token = jwt.sign({ user }, jwtKey, {
            algorithm: "HS256",
            })
            console.log("token:", token);

     // set the cookie as the token string, with a similar max age as the token
     // here, the max age is in milliseconds, so we multiply by 1000
                res.cookie("token", token);
                res.render('Main');
           }
           }))
           });

首先,如果我没有弄错代码,我看不到任何签名机制应用于JWT,这通常被认为是最佳实践

正如您所说的,您找不到任何JWT注销的例子,因为实际上没有任何例子:一旦有效的JWT被交给客户机,它就被认为对所有已建立的TTL都有效。
不过,您可以做的是向JWT令牌添加一些有状态逻辑,并将其存储在键值数据库(如Redis)中,然后开始构建已发布令牌的黑名单和白名单。因此,当您收到带有令牌的请求时,您还可以在授权客户端之前验证该令牌是否未被列入黑名单。

在搜索了很多之后,我所做的是对使用密码哈希包生成的令牌进行哈希,并将其存储到数组中。在我的授权中间件中,我正在搜索数组中是否存在令牌。注销后,我只是从数组中删除该令牌。这是一个好方法吗?这是一个好方法,尽管有一些警告的话。注意冲突概率方面的散列限制(不确定使用此代码将处理多少JWT)。另一个重要的一点是,您可能希望持久化JWTs(使用Redis或其他一些数据存储),以防程序崩溃。而且,您可能仍然希望保留旧的JWT(或那些仍然有效的blaklist),以防您与客户端保持关联,这样您就可以对谁是最常见的恶意客户端进行历史分析。