Vue学习之路之登录注册实例代码(2)

前端获取到后端传递过来的access_token,将其保存进sessionStorage。这个导航钩子我放在/p路由独享的钩子下,在进入/p/:id前拦截导航,通过axios向后端传递access_token,根据后台返回值判断是否已经登录。

导航钩子传送门

注意router.beforeEach确保要调用next方法,否则钩子就不会被 resolved,但after钩子没有 next方法,不能改变导航

beforeEnter: (to, from, next) => { let pattern = /^(\/p)/g let token = sessionStorage.getItem('accessToken') //保存token if (pattern.test(to.path)) { Axios.post('http://localhost:3000/isLogin', {access_token: token}) .then(res => { if (res.data.code === 0) { console.log(from) console.log(to) next() } else { router.push({name: 'Login'}) next() } }) .catch(err => { console.log(err) }) } }

后端处理token是否合法

后台获取到传递的token值,利用jwt.decode(token, jwtTokenSecret)对其解码,解码结果就是当初我们加密的对象{iss, exp},首先根据exp判断token是否过期,然后根据_id查询数据库是否有这个用户

// 登录验证 exports.authority = function (req, cb) { // JWT 允许客户端使用一下3个方法附加token: // 作为请求链接(query)的参数,作为主体的参数(body), // 和作为请求头(Header)的参数。 var token = (req.body && req.body.access_token) || (req.query && req.query.access_token) || req.headers['access-token'] if (token) { try { var decoded = jwt.decode(token, jwtTokenSecret) // 解码 if (decoded.exp <= Date.now()) { // 判断token是否过期 entries.code = 99 cb(false, entries) } else { // 之前加密对象是 user._id User.findOne({ _id: decoded.iss }, function(err, user) { if (err) { console.log(err) } else if (user !== null) { entries.code = 0 cb(true, entries) } }) } } catch (err) { console.log(err) } } else { entries.code = 99 cb(false, entries) } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyfzxg.html