• 前端登录时所做的token验证(路由守卫、请求拦截器、响应拦截器)


    用户进入网站首次登录,前端会携带用户信息(用户名、密码什么的)到服务端做请求

    1、服务端验证用户名密码

            未通过校验:响应给前端,用户名/密码错误等信息

            通过校验:对该用户创建token,并将token作为响应数据返回给前端

    2、前端拿到响应数据:

            错误信息:页面给予提示:用户名/密码错误

            正常信息:页面进行跳转进入首页,保存token (可以保存在cookie或localstorage) 

    3、用户点击触发请求:

            【路由守卫】(全局——Vue中的 beforeEach())

                    判断即将进入的页面需不需要token(例如:路由配置中 meta{authRequired:true})

                            不需要:next()放行,展示页面

                            需要:从本地获取token(获取到则发起请求,没获取到则返回登录页引导登录)

    1. router.beforeEach((to, from, next) => {
    2. const token = localStorage.getItem('token')
    3. // 目标路由不是登录页,并且还需要token验证,还没有token,那就直接给返回到登录页
    4. if (to.name !== 'Login'&& to.meta.authRequired && !token){
    5. next({ name: 'Login' })
    6. }else{
    7. // 目标路由是登录页-自然不需要token验证
    8. // 或目标路由不需要身份验证
    9. // 又或目标路由非登录页,需要token验证,但是有token
    10. // next放行
    11. next()
    12. }
    13. })

            存在token,向服务器发起请求时,需要携带token

                    避免代码冗余,每次请求都要配置token到请求头中,所以适用【请求拦截器】

    1. const request = axios.create({
    2. baseURL: 'http://localhost:3000',
    3. timeout: 5000,
    4. })
    5. // 请求拦截器存在两个函数参数,分别是允许请求发送,不允许请求发送
    6. request.interceptors.request.use(
    7. // config 就是请求对象
    8. (config) => {
    9. const token = localStorage.getItem('token')
    10. // 将token添加到请求对象的请求头中,跟随请求一并发送至服务器
    11. if (token) config.headers.Authorization = `Bearer ${token}`;
    12. // 请求拦截器,允许请求发送的话别忘了给请求对象返回出去,否则请求发不出去
    13. return config
    14. },
    15. (error) => Promise.reject(error),
    16. )

    4、服务端校验token

            token这个东西呢,是由服务端生成的,但是不由服务端保存,那咋校验?

            是通过某种算法,配置密钥对用户信息进行加密

            服务端拿到token后会使用密钥再对其进行解密,解密出用户信息

            token校验有效:通过,根据请求信息给予响应数据

            token校验无效:(比如存到了localstorage中,被懂些技术的用户修改了;或token过期了)

                    无论怎样都是无效,服务端解密不出来,所以给予前端响应(譬如响应状态码401)

    5、前端处理服务端给予的响应

            为了在服务端响应后,在页面展示前对响应做出处理,使用【响应拦截器】

            当状态码时401就说明token校验失败,给予用户提示/跳转到登录页面

            token通过了校验,前端根据响应数据做出展示

    1. // 这里我们假设通过后端响应的数据中的success值判断响应是否成功
    2. request.interceptors.response.use(
    3. (response) => {
    4. const { status, data,message } = response
    5. if(data.success){
    6. // 交由.then处理
    7. return data
    8. }else{
    9. // 假设后端返回状态码401代表token失效,切换到登录页面
    10. if (status === 401) {
    11. router.push({ name: 'Login' })
    12. }
    13. // 将错误信息通过Promise返回,
    14. return Promise.reject(message )
    15. }
    16. },
    17. error=>{
    18. return Promise.reject(error)
    19. }
    20. )

    请求/响应拦截器干啥呢?相同的请求/响应处理放到拦截器里,避免冗余;不同的各自处理。

    由于token由后端生成,所以前端只能验证有没有token,不能验证其有效性

  • 相关阅读:
    快速核对两个表格数据
    力扣最热一百题——盛水最多的容器
    源码探索之@LoadBalanced注解工作原理
    拧紧数据“安全阀”,筑牢个保“安全堤”
    GPT带我学-设计模式-10观察者模式
    mysql基础学习笔记
    求最大公约数
    【接口测试】Jmeter接口实战-TCP及Websocket接口,打通接口测试...
    C++二分算法:得到山形数组的最少删除次数
    工业相机中的不同的图像格式的优缺点
  • 原文地址:https://blog.csdn.net/qq_38800316/article/details/125520030