Skip to content

jwt生成token做登录态

jwt介绍优点缺点请戳参考链接1

参考链接1

参考链接2

安装:npm i jsonwebtoken

基本用法:(在校验用户登录成功的接口中生成token,并返回给前端)

  • 解析:jwt.sign(payload, secret, {expiresIn: '过期时间'}, cb(err, data))
  • 参数:payload:一个自定义对象,token的第二部分
  • secret: 自定义的一个字符串,需要保密
  • {expiresIn: }:过期时间,number类型时单位为s,string类型时可选:"2 days", "10h", "7d"等
js
// 使用jwt做登录login认证
const jwt = require('jsonwebtoken')

// 登录
router.post('/login', (req, res) => {
    let email = req.body.email
    let password = req.body.password
    User.findOne({email}).then(data => {
        // console.log(data) 
        if(!data) return res.json({code: -1, msg: '用户不存在'})
        bcrypt.compare(password, data.password).then(isOk => {
            if(!isOk) return res.json({code: -1, msg: '密码错误!'})
            let userInfo = JSON.parse(JSON.stringify(data))
            delete userInfo['password'] // 密码是重要信息,不必返回给前端
            console.log(userInfo)
            let payload = {
                email: userInfo.email,
                name: userInfo.name
            }
 //======= 生成一个token,返回给前端做登录验证用,主要就是下面这里了。================
            let token = jwt.sign(payload, 'abcd')
            userInfo.token = token
            res.json({code: 0, msg: '登录成功', data: userInfo})
        })
    })
})

需要token验证的接口,则通过jwt.verify()验证token的有效性

  • 解析:jwt.verify(token, secret cb(err, payload))
  • 参数:token:前端传递过来的token
  • secret: 生成token时自定义的那个字符串
js
// 查
router.post('/getUserList', (req, res) => {
    let serachText = req.body.serachText
    let token = req.get('T-Access-Token')  // 获取请求头携带的jwt生成的token
    jwt.verify(token, 'abcd', (err, payload) => {
        if(err) return res.json({code: -1, msg: err})
        let reg = new RegExp(serachText) //     设置正则,支持模式查询
        User.find({name: reg}, {password: 0}) //.count() 第一个参数为查询条件,第二个为data限制显示字段,为0不返回,为1则返回
            .then((data) => {
                console.log("查询用户列表" + data)
                res.send({code: 0, total: data.length, list: data})
            })
    })
})

将token验证封装成中间件函数,方便多地使用

js
let jwt = require('jsonwebtoken')
let jwtabout = require('../config/jwtabout.js')

module.exports = function tokenAuth(req, res, next){
    let token = req.get('T-Access-Token')
    jwt.verify(token, jwtabout.secret, (err, payload) => {
        if(err) return res.json({code: -1, msg: err})
        console.log('=================token验证成功===================')
        req.payload = payload
        next()
    })
}

作为中间件使用

js
router.get('/getUserList', tokenAuth, (req, res) => {
    let serachText = req.body.serachText
    let reg = new RegExp(serachText) //     设置正则,支持模式查询
    User.find({name: reg}, {password: 0}) //.count() 第一个参数为查询条件,第二个为data限制显示字段,为0不返回,为1则返回
        .then((data) => {
            console.log("查询用户列表" + data)
            res.send({code: 0, total: data.length, list: data})
        })
})