14.Vue技术栈开发实战登录登出以及JWT认证


启动后端的服务:npm run start

后端服务

首先来看后端的代码,使用express简单的搭建的一个微服务。运行在3000的端口。

login的接口,它是一个post的请求

首先获取到前端传递过来的userName和password。如果有用户名且有密码的话就获取userInfo

token是使用这个jsonwebtoken生成的


传入一个对象,这里直接把name传进去来了。第二个字段是用来加密的字符串,这里定位为abcd。
第三个字段这里设置的是过期时间为60秒

第二个接收是autorization

应用的最外层这里使用了一个中间件,所有的路由请求都匹配规则

之前我们在这里定义解决跨域的问题,app.all是匹配了所有的请求,



下面来过滤,有些接口我们是不需要token的校验的。所以用白名单的形式。它里面是对象,里面是我们的请求方式。





在请求的header里面找autorization的信息,取出来就是token

校验token

成功之后,会把username放在请求对象里面。

前端

首先需要安装两个包,js-cookie是对cookie进行读取的,md5是字符串加密的库

npm install js-cookie -S

npm install md5 -S



在登录页


router/index.js  。这里把登陆的状态改成false

这样默认就会跳转到登陆页

先把这一段注销掉

这里mock先注销掉,因为我们要请求真实的接口

前端打开代理的设置,后端的端口是3000

设置了代理之后呢,这里一定要注意。config/index.js

libs/axios.js 请求接口的路径,这里就要写成空的字符串

注意:修改了webpack的配置后,必须重新启动前端的服务。

定义登录的接口。api/user.js
结构赋值,这样直接成一个对象的形式也是可以的

但是清楚的知道,我们需要给这个方法传什么参数。所以我们就这么写

调用接口方法

我们放在状态管理的store的action里面。

引进来login在这里使用


登陆页面引入

使用mapActions拆分

这就是我们store里面定义的login。注意这里调用api里面的login方法的时候里面是结构赋值的形式

使用这个login方法。添加一个登陆按钮






后端服务这里把密码改成123


username随便写

密码改成字符串格式的123





修改下,我们只需要返回data

获取到token后,我们把它存起来,每次请求接口调用的时候呢,都把这个token放在header里,传给后端做验证
在这里我们就要封装一个方法,结合也业务的方法,我们是放在utils里面的。在utils里面封装一个setToken的方法

在封装一个getToken的方法.注意这里的 getToken是有return值的。这里一定要注意,我自己翻了个错误,没有家return ,后面就一直获取不到cookie的值

在user的store里面引入setToken

判断状态码为200,那么就保存token

登陆成功后的跳转。逻辑上的操作都放在组件内。调用完之后成功,进行跳转。

为了能够保证接口能够调完,并且返回状态。判断完状态后,再通知这个状态去做跳转或者提示错误。所以要在这module的action里面。
返回一个Promise



error的时候也是reject。

这样然后我们在组件内调用login的方法之后,进行跳转

catch里面把错误信息打印出来

我们现在这里打印一个success

用户名随便输入,密码是123。登陆成功但是做页面跳转没有反应。

这是因为路由的守卫这里写死了。所以这里要进行修改。做一下判断

如果已经登陆是可以在cookie中获取token的。

如果登陆了,那么还要判断token的有效性。验证token的有效性,那么我们就登陆服务端的authorization方法

封装一个authorization方法,mehtod可以不用写。默认就是get方法

那么token在哪里传呢?在axios的封装请求拦截这里。首先引入getToken

每次请求都会获取token放到header里面

这样我们在路由守卫这就可以调用这个接口了:store/module/user.js

验证token如果过期就把name放到请求里面(这个server端。Node.js)

如果token失效了,或者不对就返回401

同样返回一个Promise:store/module/user.js

catch返回错误信息.:store/module/user.js

路由守卫里面把这个store引入进来。

如果是跳转到登陆页,但是已经登陆了,那么就给你跳转到home页面。否则就继续

catch里面出错了那么就跳转到login页面。但是你token是有值的。还是会走到这里的路由守卫,相当于又走了一遍。这样就一直循环,是个死循环。

所以这里我们要把这个token清理掉。直接把这个token设置为一个空的字符串。

登陆成功后会跳转到首页、手动的输入login页面,也还是会跳转到home页面。

清楚浏览器的缓存。会把cookie清理掉。


再刷新页面就又会到login页面


当用户长时间在用这个网站的时候,是需要给这个token续命的,延长这个过期时间
在前端的路由守卫里面每次访问页面都会调用服务端的authorization方法,都会返回一个新的token值。那么他会重新计时,返回新的60秒。

store/module/user.js 再把token重新设置一下。这样就是新的60秒了


把服务端token的有效期设置为10秒


先登陆

登陆后一直刷新页面。并没有问题,每次刷新页面都进行了一次跳转。都会走路由守卫里面的逻辑,这样token的有效期会延长。就是新的10秒。

不刷新页面,停止10秒。在刷新页面,token过期,就会跳转到login

退出登陆



store/module/user.js 直接在action里面设置一个方法,清空token。直接设置为空的字符串。

引入mapActions

调用logout方法

清理掉token后,并且跳转到login页面


这种方案适合你对安全性没有那么高的情况。如果你对安全性要求较好就不能通过js取cookie中的token
需要在服务端开启HttpOnly。通过设置httpOnly这样就只能通过服务端把这个token设置在你的cookie里了。
你是无法通过js脚本读取和操作cookie的。这样就能避免跨站脚本的攻击

本节代码

 
 

结束

 

posted @ 2020-07-02 23:23  高山-景行  阅读(438)  评论(0编辑  收藏  举报