技能学习:学习使用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判断结果传给前端→如已登录运行接口(若未登录跳转登录页)→返回数据,我们的搭建过程就是对每个步骤进行逐一寻找找方法、解决。
另外,在某些没有使用接口的页面上,比如新建广告位功能,在保存之前没有任何接口操作,页面就不会进行强制跳转登录页面的动作。所以我们需要做前端路由校验,见下篇文章。

相关文章
|
5天前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
20 1
|
5天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
19 2
|
11天前
|
JavaScript 前端开发 测试技术
探索现代JavaScript开发的最佳实践
本文探讨了现代JavaScript开发中的最佳实践,涵盖ES6+特性、现代框架使用、模块化与代码分割、测试驱动开发、代码质量与性能优化、异步编程、SPA与MPA架构选择、服务端渲染和静态站点生成等内容,旨在帮助开发者提升代码质量和开发效率。
|
15天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第36天】本文将引导您探索Node.js的世界,通过实际案例揭示其背后的原理和实践方法。从基础的安装到高级的异步处理,我们将一起构建一个简单的后端服务,并讨论如何优化性能。无论您是新手还是有经验的开发者,这篇文章都将为您提供新的视角和深入的理解。
|
1月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
140 2
|
1月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
43 0
|
1月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
1月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
1月前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
|
1月前
|
前端开发 算法 测试技术
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
本文对比测试了通义千文、文心一言、智谱和讯飞等多个国产大模型在处理基础计数问题上的表现,特别是通过链式推理(COT)提示的效果。结果显示,GPTo1-mini、文心一言3.5和讯飞4.0Ultra在首轮测试中表现优秀,而其他模型在COT提示后也能显著提升正确率,唯有讯飞4.0-Lite表现不佳。测试强调了COT在提升模型逻辑推理能力中的重要性,并指出免费版本中智谱GLM较为可靠。
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
下一篇
无影云桌面