node使用JWT(json web token)记录

本人接触后台开发不久,最近在看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)记录)