这几天学习了如何在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
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 //用户的信息
})
})
此时发现获取成功
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:'未知错误'})
})