JWT在Express中的使用

1,563 阅读2分钟

这几天学习了如何在Express中使用JWT,分享一下我的学习成果

关于JWT

它由三部分组成,分别是Header(头部),Payload(载荷),Signature(签名)Header.Payload.Signature:Payload是真正用户信息,加密生成的字符串;而Header,Signature只是保证其安全性。

1.安装包并导入

npm i jsonwebtoken express-jwt

jsonwebtoken:用于生成JWT字符串

express-jwt:用于JWT字符串解析还原成JSON对象

const jwt=require('jsonwebtoken');
const expressJWT=require('express-jwt')

2.定义secret密钥

确保JWT字符安全性,防止在网络传输过程被别人破解,专门定义的用于加密或者解密的secret密钥 (1)生成JWT字符串,用于加密
(2)把JWT字符串解析还原成JSON对象时,用它解密

//如
const mySecret='asf134'

3.模拟登录生成token

// 登录接口
app.post('/api/login', function (req, res) {
    const userInfo = req.body
    // 登录失败
    //为了测试,用户名和密码设置为如下
    if (userInfo.username !== 'ghw' || userInfo.password !== '666666') {
        return res.send({
            status: 400,
            message: '登录失败'
        })
    }
    
    // 登录成功
    // 调用jwt.sign()方法生成JWT字符串,通过token属性发给客户端
    // 参数1:用户信息对象;参数2:加密的密钥;参数3:token有效期
   const token= jwt.sign({username: userInfo.username,
}, secretKey, { expiresIn: '3600s' })

res.send({
    status:200,
    message:'登录成功',
    token
})
})

测试已经拿到生成的token image.png

4.JWT字符串解析还原成JSON对象

// 注册将JWT字符串解析还原成JSON对象的中间件
//unless({path:[/^\/api\//]}):表示正则匹配到的 /api都不用进行解析
// 配置成功了这个中间件,就可以把解析出来的用户信息挂载到req.user
app.use(expressJWT({ secret: secretKey,algorithms:['HS256']}).unless({path:[/^\/api\//]}))
//注意:由于之前我引入最新版expressJWT,出现一些报错,所以降低了版本,我的为6.1.0,并且需要配置algorithms:['HS256']

5.获取用户信息

// 有权限的获取用户信息接口
//请求体携带token即可获取用户信息
app.get('/admin/getInfo', function(req, res){

    res.send({
        status:200,
        message:'获取信息成功',
        data:req.user //用户的信息
    })
})

此时发现获取成功

image.png

6.捕获解析JWT失败后产生的错误

// 全局错误处理中间件,捕获解析JWT失败产生的错误
app.use((err,req,res,next)=>{

// token解析失败
    if(err.name==='UnauthorizedError'){
        return res.send({
            status:401,
            message:'无效token'
        })
    }
// 其他错误
    res.send({status:500,message:'未知错误'})
})