如何在Node.js应用程序中的客户端站点上处理JWT令牌?

时间:2017-09-23 12:09:06

标签: node.js token jwt

我正在实施JWT令牌以进行身份​​验证。

我没有使用像Angular或React这样的客户端站点框架。这只是EJS。

步骤1.我开发了一个API,在成功登录后返回令牌,如下图所示(我使用Postman测试API):

API response with JSON

步骤2.然后我访问受限制的路由并使用令牌值传递Authorization标头,方法是在Postman中手动输入,它可以正常工作。

我的问题是在哪里以及如何从客户端上的步骤1保存返回的令牌,以便在步骤2的标题中发送它。

我是网络开发的新手,并且遵循教程,但是我发现的有关实现JWT令牌的所有教程都是针对Angular或React编写的,当涉及到客户端站点时。

非常感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:2)

首先您必须使用JWT创建令牌:

const token=jwt.sign({
                userId: user._id
                },config.secret, {expiresIn: '24h'});
                res.json({success:true,message:'Success', token:token, user: {username:user.username}});
您可以在前面

然后将其保存到localStorage

这将生成一个您可以在标题中实现的唯一键

在您的路线中之后,如果要检查标题中是否有JWT,请执行以下操作:

router.use((req,res,next)=>{
        const token=req.headers['authorization'];
        if(!token){
            res.json({success:false, message:"No token provided"});
        }
        else{
            jwt.verify(token, config.secret, (err,decoded)=>{
                if(err){
                    res.json({success:false,message:"Token invalid: " + err});
                }
                else{
                    req.decoded=decoded;
                    next();
                }
            });
        }
    });

这是一个中间件,用于检查“授权”标题中是否有JWT密钥

请注意,在此之后的每条路线都将运行此中间件。

Here您将找到有关JSON Web令牌的所有详细信息

修改

以下是您如何处理AJAX请求:

$("submit").click(function(){

    $.ajax({
       url : 'api/login,',
       type : 'POST',
       data : {login: $('#login').val(),password:$('#password').val()}
       dataType : 'JSON',
       success : function(data, statut){
           localStorage.setItem('token',data.token) // assuming you send a json token
       },

       error : function(resultat, statut, erreur){
         // whatever code you want
       },

       complete : function(resultat, statut){

       }

    });

});

答案 1 :(得分:0)

有一个存储令牌的对象,如果你想在用户离开后保留令牌,这样只要令牌有效,他就会保持连接,你可以将它保存在localStorage中。

在客户端执行AJAX请求时,从localStorage的对象中检索令牌,并在Authorization标头中设置令牌。