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

相关文章
|
2月前
|
Cloud Native 前端开发 JavaScript
前端开发者必看:不懂云原生你就OUT了!揭秘如何用云原生技术提升项目部署与全栈能力
【10月更文挑战第23天】随着云计算的发展,云原生逐渐成为技术热点。前端开发者了解云原生有助于提升部署与运维效率、实现微服务化、掌握全栈开发能力和利用丰富技术生态。本文通过示例代码介绍云原生在前端项目中的应用,帮助开发者更好地理解其重要性。
110 0
|
4天前
|
JavaScript 前端开发 jenkins
抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
本文探讨了在不依赖Node和VSCode的情况下,仅使用记事本和浏览器开发一个完整的Vue3前端项目的方法。通过CDN引入Vue、Vue Router、Element-UI等库,直接编写HTML文件实现页面功能,展示了前端开发的本质是生成HTML。虽然日常开发离不开现代工具,但掌握这种基础方法有助于快速实现想法或应对特殊环境限制。文章还介绍了如何用Node简单部署HTML文件到服务器,提供了一种高效、轻量的开发思路。
39 10
|
3月前
|
JavaScript 前端开发 Docker
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
在使用 Deno 构建项目时,生成的可执行文件体积较大,通常接近 100 MB,而 Node.js 构建的项目体积则要小得多。这是由于 Deno 包含了完整的 V8 引擎和运行时,使其能够在目标设备上独立运行,无需额外安装依赖。尽管体积较大,但 Deno 提供了更好的安全性和部署便利性。通过裁剪功能、使用压缩工具等方法,可以优化可执行文件的体积。
214 3
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
|
3月前
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
180 7
|
3月前
|
缓存 前端开发 JavaScript
前端的全栈之路Meteor篇(二):容器化开发环境下的meteor工程架构解析
本文详细介绍了使用Docker创建Meteor项目的准备工作与步骤,解析了容器化Meteor项目的目录结构,包括工程准备、环境配置、容器启动及项目架构分析。提供了最佳实践建议,适合初学者参考学习。项目代码已托管至GitCode,方便读者实践与交流。
|
3月前
|
存储 前端开发 JavaScript
前端的全栈之路Meteor篇(四):RPC方法注册及调用-更轻量的服务接口提供方式
RPC机制通过前后端的`callAsync`方法实现了高效的数据交互。后端通过`Meteor.methods()`注册方法,支持异步操作;前端使用`callAsync`调用后端方法,代码更简洁、易读。本文详细介绍了Methods注册机制、异步支持及最佳实践。
|
3月前
|
前端开发 JavaScript 中间件
前端全栈之路Deno篇(四):Deno2.0如何快速创建http一个 restfulapi/静态文件托管应用及oak框架介绍
Deno 是由 Node.js 创始人 Ryan Dahl 开发的新一代 JavaScript 和 TypeScript 运行时,旨在解决 Node.js 的设计缺陷,具备更强的安全性和内置的 TypeScript 支持。本文介绍了如何使用 Deno 内置的 `Deno.serve` 快速创建 HTTP 服务,并详细讲解了 Oak 框架的安装和使用方法,包括中间件、路由和静态文件服务等功能。Deno 和 Oak 的结合使得创建 RESTful API 变得高效且简便,非常适合快速开发和部署现代 Web 应用程序。
161 2
|
3月前
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
|
3月前
|
JavaScript 前端开发 Docker
前端的全栈之路Meteor篇(一):开发环境的搭建 -全局安装或使用容器镜像
本文介绍了如何搭建 Meteor 开发环境,包括全局安装 Meteor 工具和使用 Docker 镜像两种方法,以及创建和运行一个简单的 Meteor 项目的基本步骤。 Meteor 是一个全栈 JavaScript 框架,适用于构建实时 Web 应用程序。文章还提供了遇到问题时的解决建议和调试技巧。
162 3
|
3月前
|
JavaScript 前端开发 Serverless
前端全栈之路Deno篇:Deno2.0与Bun对比,谁更胜一筹?可能Deno目前更适合serverless业务
在前端全栈开发中,Deno 2.0 和 Bun 作为新兴的 JavaScript 运行时,各自展现了不同的优势。Deno 2.0 重视安全性和多平台兼容性,尤其是对 Windows 的良好支持和原生 TypeScript 支持;而 Bun 则以卓越的性能和简便的开发体验著称,适合快速迭代的小型项目。两者在不同场景下各具特色,Deno 更适合企业级应用和serverless,Bun 则适用于追求速度的项目。
387 1

热门文章

最新文章