Express+JWT实现Token设置、验证和解析

4,331 阅读2分钟

分享基于Express的node服务端实现token的设置、验证和解析,下载即可使使用

gitbub地址: github.com/cgq001/expr…

常用相关依赖

npm install express -S   //Express 轻量级的node web框架

npm install jsonwebtoken -S   //JWT生成Token

npm install express-jwt -S   //JWT生成的Token的验证和解析

npm install cors -S   //node跨域

app.js页面配置

const express = require('express')
const app = express()

const path = require('path')
//引入post请求解析插件
const bodyParser = require('body-parser')
//node跨域设置
const cors = require('cors')

// 配置静态目录
app.use(express.static(path.join(__dirname,'public')))

// 配置body-parser
app.use(bodyParser.json({limit: '10mb'}))
app.use(bodyParser.urlencoded({limit: '10mb', extended: true}))

// 配置跨域
app.use(cors());

// 引入index路由文件
const index = require('./router/index')
app.use('/index',index)

//配置端口,上线建议直接指定
const port = process.env.PORT || 5005

//启动服务器
app.listen(port,()=>{
	console.log('开启服务器')
})

router/index.js路由文件

const express = require('express');
const jwt = require('jsonwebtoken')
const Routers = express.Router();

const { secretKey } =require('../token/constant')  //提取Token加密内容 ,见下
// 全局验证Token是否合法
const tokens = require('../token/index')  //验证Token配置文件,见下
//注册token配置文件
Routers.use(tokens)



// 如果token过期或者 错误的处理(结尾附 过期和错误的代码区别)
Routers.use(function (err, req, res, next) {
    if (err.name === 'UnauthorizedError') {   
        //  这个需要根据自己的业务逻辑来处理( 具体的err值 请看下面)
      res.status(401).send('非法token');
    }
  })


// 验证服务是否开启
Routers.get('/', (req,res) => {
    
    console.log(req.user);  //解析token,获取token携带的数据

    res.json({
        code: 0,
        msg: '查询成功',
        data:{
            username: '这是首页'
        }
    })
})

// 登陆并生成token
Routers.get('/load', (req,res) => {

    let tokenObj={   //携带参数
        id: 1,
        username: '小明'
    }
    let tokenKey = secretKey  //加密内容

    let token = jwt.sign(tokenObj,tokenKey,{
        expiresIn: 60*60*24   // token时长
    })

    res.json({
        code: 0,
        msg: '查询成功',
        token:token,
        data:{
            username: '12456'

        }
    })
})


module.exports = Routers;

Token验证的配置文件 ../token/index

const expressJwt = require('express-jwt');
const { secretKey } = require('./constant');

const jwtAuth = expressJwt({secret: secretKey}).unless({path:['/index/load']})

//unless 为排除那些接口,不验证Token,这里排除 '/index/load'
//注意这里的排除 为整个服务端路由,我们这里的 router/index.js 下的 /load 路由,实际是出于 /index 路由之下,详见app.js页面 app.use('/index',index) 配置

module.exports = jwtAuth;

公共配置 ../token/constant

const crypto = require('crypto');

module.exports = {
  MD5_SUFFIX: '805696667',
  md5: (pwd) => {
    let md5 = crypto.createHash('md5');
    return md5.update(pwd).digest('hex');
  },
  secretKey: 'nodebook_index'  //Token加密公共部分
};