express框架中使用jwt实现验证的方法

2020-06-17 06:08:22易采站长站整理

var token = authenticate.getToken({_id: req.user._id}) // 得到签发后的jwt
res.statusCode = 200
res.setHeader('Content-Type', 'application/json')
res.json({success: true, token: token, status: 'You are successful logged in!'})
})

6. 前端保存token


// use localStorage
$.ajax({
type: 'post',
dataType: 'json',
url: 'users/login',
data: {
username: 'un',
password: 'pw'
},
success: funciton (res) {
localStorage.token = getToken(res)
},
error: funciton (err) {...}
})
// 还可以使用vux方法。
// 还可以使用封装axios方法。

7. 用户登录超时
jsonwebtoken验证jwt后,若结果不通过,会有3种错误类型。分别是

TokenExpiredError // 当token超时时抛出。


err = {
name: 'TokenExpiredError',
massage: 'jwt expired',
expired: [ExpDate]}
JsonWebTokenError

jwt错误


err = {
name: 'JsonWebTokenError',
message: 'jwt malformed' // 'jwt malformed', 'jwt signature in required', 'invalid signature', 'jwt audience invalid. expected: [OPTIONS AUDIENCE]', 'jwt issuer invalid. expected: [OPTIONS ISSUER]', 'jwt id invalid. expected:[OPTIONS JWT ID]', 'jwt subject invalid. expected: [OPTIONS SUBJECT]'
}

NotBeforeError

当当前时间超过nbf的值时抛出该错误。


err = {
name: 'NotBeforeError',
message: 'jwt not active',
date: 2018-10-04T16:10:44.000Z
}

passport在验证jwt不通过时(token过期也是一种不通过)自动向前端发送“状态码为401,内容是Unauthorized”.
在使用passport/passport-jwt/jsonwebtoken时没有发现处理token过期的方法。所以在使用passport-jwt验证不通过时再写一个验证是否过期的方法。


// authenicate.js
...
export.verifyUser = passport.authenticate('jwt', {
session: false,
failureRedirect: '/error/auth' // 在这个路由里统一处理验证不通过的事情
})


// routes/error.js
...
router.get('/auth', (req, res, next) => {
let header = req.headers
let rawToken = header.authorization
if (!rawToken.split(' ').length) {
res.json({ // 统一的数据结构方便前端使用
code: 403,
data: {},
message: 'error for get token'
})
} else {
let token = rawToken.split(' ')[1] jwt.verify(token, config.secretKey, err => { // 这里用到jsonwebtoken/config。注意引用
switch (err.name) {
case 'TokenExpiredError':
case 'NotBeforeError':
let payload = jwt.decode(token)
token = authenticate.getToken({_id: payload._id})
res.statusCode = 200