美文网首页前端笔墨Nodejs
node使用JWT(json web token)记录

node使用JWT(json web token)记录

作者: ChasenGao | 来源:发表于2018-07-26 18:13 被阅读496次

    本人接触后台开发不久,最近在看token相关的文章,看了几天有一些收获,不过也存在一些问题,这篇文章只是记录一个我的学习过程。
    如果文中出现错误,请大牛指正。
    官网 https://jwt.io/
    node.js模块库及教程:https://github.com/auth0/node-jsonwebtoken

    基础用法:(和官网有细微区别)

    #生成一个token
    const jwt = require('jsonwebtoken');
    const secret = 'abc';
    let token = jwt.sign({
        name: 'ChasenKaos',
    }, secret, (err, token) => {
        console.log(token)
    });
    
    #验证token
    let _token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiQ2hhc2VuS2FvcyIsImlhdCI6MTUzMjU5NDIzOH0.88q7NhhOieHjin5-4P9dTO8jaRyZheNLHG6GhU2Ol6Y"
    
    jwt.verify(_token, secret, (error, decoded) => {
        if(error) {
            console.log(error.message);
        }
        console.log(decoded);
    })
    

    其他细节用法请去官网查询。

    对于token使用的理解如下图:

    如果理解有误,请大牛指出。


    image.png

    可我在使用jsonwebtoken这个模块的时候,发现其只有生成和验证的方法,如果要按照上面的流程图来使用,我个人认为还要加工一下:

    我把生成token的方法二次加工了一下,代码如下:

    const createToken = (username, plat, expires, strTimer) => {
        let token = jwt.sign({
            User: username,
            Plat: plat
        }, secret, {
            expiresIn: expires + " " + strTimer
        });
        return token;
    }
    

    其中的User和Plat都是我乱加的,这些信息可以根据自己需要替换。

    这时我要生成两个token,一个七天有效期的存放到数据库,一个2小时有效期的发给用户,就可以用下面的方法:

    let serverToken = createToken("admin", "WEB", "7", "days");
    let localToken = createToken("admin", "WEB", "2", "hours");
    console.log(serverToken);
    console.log(localToken);
    

    然后我只要通过操作数据库和响应用户请求即可完成保存和发送token。
    用户的本地token过期时,服务器可以先判断数据库中的serverToken是否过期,如果过期就让用户重新登录,重新登录后,本地token和服务器token都会被重新刷新。如果服务器token没过期,就重新生成一个2小时有效期的localToken给用户。

    验证token

    验证token的方法我也进行了二次加工:

    const verifyToken = (_token) => {
        let verify = jwt.verify(_token, secret, (error, decoded) => {
            if(error) {
                return "Token Invalid";
            }
            return decoded;
        });
        return verify;
    };
    

    然后试试:

    console.log(verifyToken("123123123"));
    

    结果如下:

    Token Invalid
    

    用户在使用时,本地token过期怎么办?

    我认为的是,完全不用担心。
    因为就算本地token过期,服务器token还没过期,我们只要让用户每次请求都发送token,那么只要在服务器token有效期之内,用户的操作是不受影响的,最多会增加几百毫秒的刷新token时间。

    完整代码:

    token.js

    const jwt = require('jsonwebtoken');
    
    const secret = 'abc';
    
    const createToken = (username, plat, expires, strTimer) => {
        let token = jwt.sign({
            User: username,
            Plat: plat
        }, secret, {
            expiresIn: expires + " " + strTimer
        });
        return token;
    }
    
    //let serverToken = createToken("admin", "WEB", "7", "days");
    //let localToken = createToken("admin", "WEB", "2", "hours");
    //console.log(serverToken);
    //console.log(localToken);
    
    const verifyToken = (_token) => {
        let verify = jwt.verify(_token, secret, (error, decoded) => {
            if(error) {
                return "Token Invalid";
            }
            return decoded;
        });
        return verify;
    };
    
    //console.log(verifyToken("123123123"));
    exports.createToken = createToken;
    exports.verifyToken = verifyToken;
    

    只需要在入口文件中require token.js即可使用方法。

    入口文件

    const token = require('./router/token.js');
    console.log(token.createToken("admin1","WEB","7","days"));
    

    相关文章

      网友评论

        本文标题:node使用JWT(json web token)记录

        本文链接:https://www.haomeiwen.com/subject/vkrbmftx.html