node + express 实现简单token验证

1,402 阅读1分钟
  1. 安装 jsonwebtoken

    npm install jsonwebtoken --save

  2. 添加 token.js 生成和验证 token

    const jwt = require("jsonwebtoken")
    const signkey = 'mes_qdhd_mobile_xhykjyxgs'
    
    exports.setToken = (username) => {
        return new Promise((resolve, reject) => {
            // sing接收的第一个参数为一个对象(可自定义),否侧报错:jwt malformed
            const token = jwt.sign({
                username
            }, signkey, { expiresIn: '1h' });
            resolve(token);
        })
    }
    
    exports.verToken = (token) => {
        return new Promise((resolve, reject) => {
            jwt.verify(token, signkey, (err, result) => {
            // 网上有些教程此处使用 token.split('.')[1],无法校验,源码中已经做了处理
            // var parts = jwtString.split('.');
    
            // if (parts.length !== 3){
            //    return done(new JsonWebTokenError('jwt malformed'));
            // }
                if (err) {
                    console.log(err);
                    reject(err)
                } else {
                    console.log(result);
                    resolve(result)
                }
            })
        })
    }
    
  3. app.js 中添加配置

    const token = require("./token")
    
    app.use(function(req, res, next) => {
        
        const URL = req.url
    
        if (URL === '/login') {
        // 登录接口无需校验
            return next()
        }
        
        // 获取token值
        const authorization = req.headers['authorization'];
    
        if (authorization === "undefined") {
            return res.status(401).send('Unauthorized')
        } else {
            // 验证token
            token.verToken(authorization).then((data) => {
                req.data = data;
                return next();
            }).catch((error) => {
                return res.status(401).send('Unauthorized');
            })
        }
    })
    
  4. 登录后设置token值

    const token = require("./token")
    
    app.use("/login", (req, res) => {
    // 登录逻辑
        token.setToken(req.body.username).then(token => {
            res.status(200).send({
                token,
            })
        })
    })