技能学习:学习使用Node.js + Vue.js,开发前端全栈网站-12-3.登陆的token验证(校验登录)

简介: token验证的实现方式很简单,只需要在所有后端接口中添加一个验证是否存在token的中间件即可,接口的访问过程是调用→运行→返回数据。所以我们在接口调用之后、运行之前的位置加一个验证token的函数作为接口的中间件,从而验证到非登录人员,将其页面跳转到登陆页面即可。

token验证的实现方式很简单,只需要在所有后端接口中添加一个验证是否存在token的中间件即可,接口的访问过程是调用→运行→返回数据。所以我们在接口调用之后、运行之前的位置加一个验证token的函数作为接口的中间件,从而验证到非登录人员,将其页面跳转到登陆页面即可。
在这里插入图片描述

1.在server端获取admin端sessionStorage(或localStorage)存储的token

我们要通过将sessionStorage传入请求头的方式在server端获取页面存储的token。这样做可以避免修改每一个接口(在每一个接口中获取token,再传到后台),后台可以直接在请求头中获取需要的token值。

方法是:在http.js中全局设置获取token,将token值传入请求头**Request
Headers**中,然后后台接口中直接从请求头中获取token,从而实现验证。

(1)使用axios里的Interceptors方法
在npm官网查询axios
在这里插入图片描述
admin/http.js前端admin端将token传入请求头Request Header:
在这里插入图片描述

// 使用axios的interceptors拦截器,将http调用时拦截
http.interceptors.request.use(function (config) {
    // 将token值传入请求头,"Bearer+空格"是行业规范,一看见Bearer(持票人,也就是被校验者)就知道是token验证
    config.headers.Authorization = 'Bearer ' + sessionStorage.token
    return config;
}, function (error) {
    return Promise.reject(error);
});

(2)server后端接口处接收请求头中的token值
server/routes/admin/index.js,添加中间件后的新建数据接口:

// 新建数据(增)
    router.post('/', async(req, res, next) => {
        // 获取请求头中的token
        // 1.前端的authorization首字母大写,后端小写,自动对应
        // 2.获取到的有可能为空值
        // 3.由于根据代码规范传入的token值带有Bearer和空格,所以用split方法找到空格,在空格处分离Bearer和token值形成数组
        // 4.再使用pop方法提取数组中最后一个值(也就是token值)
        const token = String(req.headers.authorization || '').split(' ').pop() 
        // 使用jwt提取token数据(解密),当时我们传入的是用户id,所以解密出的就是用户id和一个自带参数
            // 引入jsonwebtoken
        const jwt = require('jsonwebtoken')
        // 1.jwt的verify为解密方法
        // 2.解密方法与加密方法相同,对token进行解密,需要用到全局定义的secret密钥
        // 3.利用解构赋值{}方法将id解构
        const { id } = jwt.verify(token, app.get('secret'))
        // 利用id查找是否有此用户id,以防伪造jwt登录
            // 引入model模型
       // const Admin = require('../../models/Admin')
            // 查询id,将查询到的user放入req,方便其他接口也能够使用
       // req.user = await Admin.findById(id)
        console.log(id)
        // 执行下一步
        await next()
    }, async(req, res) => {
        // const Model = require('../../model/' + req.params.resourse)
        const model = await req.Model.create(req.body)
        res.send(model)
    })

新建一个分类,测试查看终端查询到的req.user:
在这里插入图片描述
没问题,查看Request Header:
在这里插入图片描述

3.http-assert 验证提示工具

如果登陆异常状态下无故跳转到登录页,用户会以为网站有问题吧,所以我们要像登录接口一样,发送错误状态码和错误信息。
我们在登录接口中使用的发送错误信息方式是:

    // 如果用户名为空
        if(!username){
            return res.status(422).send({
                message: '请输入用户名'
            })
        }

有一个工具,可以用一行代码将这一段替代,http-assert(用于测试函数、值是否存在、是否正确的工具包)。
使用方法:

cd server
npm i http-assert

安装并引入:
在这里插入图片描述
使用方法:

    // 如果用户名为空
        // if(!username){
        //     return res.status(422).send({
        //         message: '请输入用户名'
        //     })
        // }

        // assert方式修改后
        assert(username, 422, '请输入用户名')
        // 是否有username, 没有就报错422, 报错信息是‘’

在这里插入图片描述
测试:
在这里插入图片描述
报错422没问题,但是message没有接收到。是因为http-assert是以抛出异常的方式进行报错的,前端无法获取到json数据。
所以我们要写一个错误处理函数,对抛出的异常做处理,将异常中的内容进行捕获并传给前端admin。

// 错误处理函数(中间件)
    app.use(async(err, req, res, next) => {
        // 如果发送错误码,将错误码放到res输出到前端显示
        // 如果获取不到状态码,就是500错误,所以状态码报错或500报错
        res.status(err.statusCode || 500).send({
            message: err.message
        })
    })

在这里插入图片描述
在登录页测试,没问题:
在这里插入图片描述
可以将此类操作都改成这个格式,我这里只在token判断中间件里添加:
在这里插入图片描述
删除sessionStorage中的登录状态token:
在这里插入图片描述
新建数据进行测试,出现了新问题:
在这里插入图片描述
意思是jwt格式错误,是jwt包传递过来的信息,被我们接收并打印出来了。我们看一下Request Header:
在这里插入图片描述
应该是我们将token值删除后,jwt不认识undefined,不能将其定义为空,所以我们在前端admin的http.js拦截器函数中进行修改:
在这里插入图片描述
测试:
在这里插入图片描述
没问题。
4.如果token验证未登录,跳转登录页。
任何操作中,若验证出现token报错,直接跳转到登录页即可,我们可以使用错误处理函数,将所有token相关的报错码写为401,当报错401统一跳转页面到登录页。
在这里插入图片描述
修改http.js响应拦截函数:
在这里插入图片描述

要想使用路由,该页面上方要引入:
在这里插入图片描述
测试:
在这里插入图片描述
成功跳转登录页。

5.封装token中间件

中间件内容很多,如果将每个需要用到这个中间件的接口都赋值此段内容,代码就会异常多且乱,所以我们将它封装成一个函数,使用到时直接把函数名放入即可。
在这里插入图片描述
封装:
在这里插入图片描述
使用,在除登录接口以外admin使用的接口都使用此中间件:
在这里插入图片描述
sessionStorage.clear()测试:
在这里插入图片描述
只要使用到接口的地方,就会直接跳转登录页。

6.上传图片的接口错误解决

当我们给图片上传接口也添加token中间件后,突破就无法上传了。
依然报错401:
在这里插入图片描述
看一下network里边的接口调用情况,Request Header没有带上Authorization:
在这里插入图片描述
这是因为我们请求拦截过程中使用的是axios方法中的拦截方法,但是图片上传我们用的是elementUI自带的上传请求库进行图片的上传。
在这里插入图片描述
所以修改图片上传功能,SkillSet.vue、AdSet和富文本编辑器等使用到图片上传功能页面中图片上传加一个传递header的方法:
(1)在全局添加token到header的方法,使用mixin()全局定义方法:
在这里插入图片描述
(2)使用全局定义的getAuthHeaders()函数方法:
在这里插入图片描述
在新建技能页面测试:
在这里插入图片描述
没问题,之后我们在所有图片上传的组件中添加:headers="getAuthHeaders()"即可。

7.总结

只要我们确立好实现token验证的过程方向后就可以完成这个功能。登录的token验证过程非常简单,就是调用接口→发送token→接收token→判断token→将token判断结果传给前端→如已登录运行接口(若未登录跳转登录页)→返回数据,我们的搭建过程就是对每个步骤进行逐一寻找找方法、解决。
另外,在某些没有使用接口的页面上,比如新建广告位功能,在保存之前没有任何接口操作,页面就不会进行强制跳转登录页面的动作。所以我们需要做前端路由校验,见下篇文章。

相关文章
|
22天前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
65 0
|
8天前
|
前端开发 JavaScript 开发者
Express.js与前端框架的集成:React、Vue和Angular的示例与技巧
本文介绍了如何将简洁灵活的Node.js后端框架Express.js与三大流行前端框架——React、Vue及Angular进行集成,以提升开发效率与代码可维护性。文中提供了详细的示例代码和实用技巧,展示了如何利用Express.js处理路由和静态文件服务,同时在React、Vue和Angular中构建用户界面,帮助开发者快速掌握前后端分离的开发方法,实现高效、灵活的Web应用构建。
29 3
|
16天前
|
前端开发 JavaScript
前端ES5 | js —添加元素方法
前端ES5 | js —添加元素方法
|
21天前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
27 1
|
21天前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
47 0
|
21天前
|
开发者 C# Android开发
明白吗?Xamarin与Native的终极对决:究竟哪种开发方式更适合您的项目需求,让我们一探究竟!
【8月更文挑战第31天】随着移动应用开发的普及,开发者面临多种技术选择。本文对比了跨平台解决方案Xamarin与原生开发方式的优势与劣势。Xamarin使用C#进行跨平台开发,代码复用率高,可大幅降低开发成本;但因基于抽象层,可能影响性能。原生开发则充分利用平台特性,提供最佳用户体验,但需维护多套代码库,增加工作量。开发者应根据项目需求、团队技能和预算综合考量,选择最适合的开发方式。
59 0
|
21天前
|
开发者 Android开发 iOS开发
Xamarin开发者的神器!揭秘你绝不能错过的插件和工具,让你的开发效率飞跃式提升
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程,保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用介绍 Xamarin.Forms 的基本功能和工作原理。首先配置 Visual Studio 开发环境,然后创建并运行一个包含标题、按钮和消息标签的示例应用,展示如何定义界面布局及处理按钮点击事件。这帮助开发者快速入门 Xamarin.Forms,提高跨平台应用开发效率。
31 0
|
21天前
|
Java 开发者 关系型数据库
JSF与AWS的神秘之旅:如何在云端部署JSF应用,让你的Web应用如虎添翼?
【8月更文挑战第31天】在云计算蓬勃发展的今天,AWS已成为企业级应用的首选平台。本文探讨了在AWS上部署JSF(JavaServer Faces)应用的方法,这是一种广泛使用的Java Web框架。通过了解并利用AWS的基础设施与服务,如EC2、RDS 和 S3,开发者能够高效地部署和管理JSF应用。文章还提供了具体的部署步骤示例,并讨论了使用AWS可能遇到的挑战及应对策略,帮助开发者更好地利用AWS的强大功能,提升Web应用开发效率。
43 0
|
21天前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
44 0
|
22天前
|
JavaScript 前端开发 开发者
Vue.js的未来已来:掌握最新功能,驾驭前端开发的新浪潮!
【8月更文挑战第30天】Vue.js作为前端开发领域的明星框架,凭借其轻量级、响应式及组件化特性,深受全球开发者喜爱。它持续进化,引入新功能并优化性能,如提升渲染速度和减小打包体积,增强TypeScript支持,简化组件编写流程,进一步提升应用响应性和加载速度,改善开发者体验。活跃的社区和丰富的开源项目如“vuejs-challenges”推动其不断发展。未来,Vue.js将探索更多新特性,如宏和非虚拟DOM模式,巩固其在现代前端框架中的领先地位。
34 0