koa2 + jsonwebtoken + koa-jwt:实现node token验证

一、koa token生成、验证

koa-jwt官网

https://github.com/koajs/jwt

推荐一个koa-jwt学习文档:

https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

jsonwebtoken方法添加

const { sign, verify } = require('jsonwebtoken');
const secretKey = "cariadakkodis";module.exports = {// 获取tokengetToken(ctx) {return ctx.request.headers.Authorization || '';},// 加密signToken(userInfo){// 定义 secret 密钥const token = sign({ username: userInfo.username, password: userInfo.password },secretKey,{ expiresIn: '1h' }// { expiresIn: 10 } // 10s);return token;},// 验签verifyToken(token){return verify(token, secretKey);},// 将secretKey返回secretKey
}

app.js 中添加

const jwt = require("koa-jwt");
const token = require("./utils/token.js");// 对没有验签通过返回的错误进行拦截处理
app.use(async (ctx, next) => {// 如果token没有经过验证中间件会返回401错误,可以通过下面的中间件自定义处理这个错误await next().catch((err)=>{if (401 === err.status) {ctx.status = 401;ctx.body = {data: '没有找到token信息,请检查接口请求头信息'};console.log("未找到token: "+ err);} else {console.log(err);throw err;}});
});// unless 某些特殊接口不验证toekn 比如登录
app.use(jwt({ secret: token.secretKey }).unless({ path: [/^\/api\/user\/login/]}));// 这下面添加route逻辑
app.use(index.routes(), index.allowedMethods());

这样就可以了 我们用 jsonwebtoken生成token,koa-jwt来验证token,
在这里插入图片描述
上面是 koa-jwt 源码中的一个文件,获取到 token,这里就明确了一个点,前端接口在header中需要使用 authorization 字段传递 token

二、具体业务处理

我们再看下 login登录的接口怎么处理,下面涉及到具体业务代码看不懂也没关系,上面的代码已经实现了 koa token的使用、验证。
我用的是 elasticSearch 数据库
这里routes文件是对接的接口
controller文件 控制层 具体的接口逻辑
modules文件 连接数据库的操作
在这里插入图片描述

const router = require('koa-router')();
// 导入 controller
const user = require('../controller/User.js');
router.prefix('/api/user');
router.post('/login', user.loginFun);
module.exports = router;

在这里插入图片描述

const Base = require('../modules/base.js');
const modulesBase = new Base();
const token = require('../utils/token.js');
class User {constructor() {}async loginFun(ctx, next) {const registerBody = ctx.request.body;console.log(registerBody);let result = await modulesBase.searchUser({query: {bool: {must: [{match: {username: registerBody.username}},{match: {password: registerBody.password}}]}}});if (result.hits && result.hits.hits.length) {ctx.body = {data: {data: {role: result.hits.hits[0]._source.role,username: result.hits.hits[0]._source.username},message: 'success',success: true,token: token.signToken({username: registerBody.username, password: registerBody.password})}};return;}ctx.body = {data: {data: null,message: 'Incorrect account or password',success: false}};}
}
module.exports = new User();

在这里插入图片描述

const Db = require('../db/index');
class BaseModule {constructor() {const db = new Db();this.environment = db.getEnvironment()['environment'];this.elasticSearch = db.elasticSearch();}async search(params) {return await this.elasticSearch.search(Object.assign({index: 'data-viz-test'}, params));}async update(params) {return await this.elasticSearch.update(Object.assign({index: 'data-viz-test'}, params));}async searchUser(params) {return await this.elasticSearch.search(Object.assign({index: 'users'}, params));}
}module.exports = BaseModule;

三、下面我们来看下前端代码

request({url: '/user/login',method: 'post',data: {username: ruleForm.username,password: ruleForm.password}}).then((res) => {if (res.data.success && res.data && res.data.data) {const role = res.data.data.role;const username = res.data.data.username;const token = res.data.token;localStorage.setItem('role', role);localStorage.setItem('username', username);localStorage.setItem('token', token);router.push('/');return;}ElMessage({type: 'warning',message: res.data.message});});

request.ts

// service.ts
import axios from 'axios';
import { ElMessage } from 'element-plus';
const service = axios.create({baseURL: '/api',timeout: 1000 * 30, // 超时时间headers: {'Content-Type': 'application/json;charset=utf-8'},validateStatus () {return true;}
});service.interceptors.request.use((config: any) => {// 添加请求头以及其他逻辑处理const token = localStorage.getItem('token');if (token) {// Bearer 后面加空格 这也是 koa-jwt 的要求config.headers['Authorization'] = `Bearer ${token}`;}return config;},(error: any) => {Promise.resolve(error);}
);/*** 响应拦截器*/
service.interceptors.response.use((response: any) => {// console.log('响应拦截:拦截事件可以放这里', response)// 后端status错误判断if (response.status === 200) {return Promise.resolve(response.data);}if (response.status === 401) {ElMessage({message: 'Authentication expired',type: 'warning',});localStorage.removeItem('token');localStorage.removeItem('username');localStorage.removeItem('role');window.location.href = '/login';return response.data;}return Promise.reject(response.data);},(error: any) => {// Http错误状态码处理console.log('error----');console.log(error);return Promise.reject(error);}
);
export default service;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习 1、 Flyer[3].step(1) Flyer[7].step(2) Flyer[11].step(1) for i in range(4):Flyer[i * 2].step(1) Flyer[8].step(3)for i in range(3):Dev.turnRight()Dev.step(-5)2、 for i in range(5):Flyer[i5].step(Flyer[…

JavaWeb--18 tlias-web-management 登录认证

登录认证 1 登录功能功能开发 2 登录校验2.1 问题分析2.2 会话技术CookieSession令牌技术 2.3 JWT令牌介绍生成和校验登录下发令牌 2.4 过滤器Filter拦截路径过滤器链 登录校验-Filter 2.5 拦截器InterceptorInterceptor详解执行流程 登录校验- Interceptor 3 异常处理3.1 当前…

【会议征稿】2024年机器人前沿技术与创新国际会议(FTIR 2024, 7/19-21)

2024年机器人前沿技术与创新国际会议(FTIR 2024)将于2024年7月19-21日在中国杭州举行。FTIR 2024聚焦前沿技术与创新,将把机器人领域的创新学者和专家聚集到一个共同的论坛。会议的主要目标是促进机器人的研究和开发活动,另一个目…

基于EBAZ4205矿板的图像处理:11阈值系数可调的图像局部阈值二值化

基于EBAZ4205矿板的图像处理:11阈值系数可调的图像局部阈值二值化 先看效果 还是一样拿我的pynq当模特,然后用usb——HDMI采集卡把输出图像采集到电脑上。 注意看右边mobelxtem中的通过串口调节的参数, 我这里是实现了阈值系数可调的局部阈…

利用CAD绘制角度斜线的简易指南---模大狮模型网

在CAD设计中,绘制角度斜线是常见的需求,尤其在工程、建筑等领域中。正确绘制角度斜线不仅可以提高图纸的清晰度和美观度,还有助于准确表达设计意图。本文将介绍如何利用CAD软件进行角度斜线的绘制,为您提供简明易懂的操作指南。 一…

安全设备篇——抗DDOS设备

写在前面:up初研究这个设备的时候以为很容易,毕竟ddos嘛大家都懂,但是实际去找资料和研究的时候发现资料少的可怜,再加上大家知道ddos但大多没见过,万幸up的老东家某普有这类设备,和之前的同事沟通了一下还…

网络完全精通版

一、目录结构 1.1目的的特点 windows和linux windows中C、D、E盘,每个都是一个根系统【多跟系统】 linux中只有一个根【单根系统】 1.2各个目录存储的内容 /root:linux中挂管理员用户的家目录 /home:linux中挂存储普通用户的家目录的目…

Unity射击游戏开发教程:(17)添加推进器推进和推进器推进动画

添加推进器打开功能 我们可以添加一个推进器栏,用于跟踪玩家使用推进器增强(按住左 Shift 键)的时间。当未使用推力时,将会有一段延迟,直到推力条开始再生。当棒再生时,可以使用推进器,但再生过程将重新开始。 我们将使用 Unity 的 UI Slider 组件,因此我们将其添加到已…

银河麒麟V10操作系统编译LLVM18踩坑记录

1、简述 要在银河麒麟V10操作系统上编译一个LLVM18,这个系统之前确实也没有用过,所以开始了一系列的摸排工作,进行一下记录。 首先肯定是要搞一个系统,所以去到银河麒麟的网站,填写了一个申请 产品试用申请国产操作系…

数据结构--链表的基本操作

1. 链表的概念及结构 概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 链表也是线性表的一种。 链表的结构跟⽕⻋⻋厢相似,淡季时⻋次的⻋厢会相应减少,旺季时…

嵌入式—STC芯片开发板点亮第一盏灯

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 一: 原理图二: 需求实现三:编码实现四:代码实现五:编译烧录运行 一&…

HTML哆啦A梦

目录 写在前面 HTML简介 完整代码 代码分析 系列推荐 写在最后 写在前面 谁不想拥有一只可爱的叮当猫呢?本期小编给大家带来了一个萌萌的哆啦A梦。 HTML简介 HTML,即超文本标记语言,是构建网页的基础技术之一,它是一种标…

JavaEE初阶-多线程进阶2

文章目录 前言一、CAS1.1 CAS的概念1.2 原子类1.3 CAS的ABA问题 二、JUC中常用类2.1 Callable接口2.2 ReentrantLock(可重入)2.3 Semaphore信号量2.4 CountDownLatch类2.5 CopyOnWriteArrayList类2.6 ConcurrentHashMap 前言 对于多线程进阶的部分&…

C语言例题43、打印倒立金字塔

#include <stdio.h>void main() {int i, j;for (i 5; i > 0; i--) {for (j 5; j > i; j--) {//输出空格printf(" ");}for (j 2 * i; j > 1; j--) {//输出星号printf("* ");}printf("\n");} }运行结果&#xff1a; 本章C语言…

用好 explain 妈妈再也不用担心我的 SQL 慢了

大家好&#xff0c;我是聪&#xff0c;一个乐于分享的小小程序员。在不久之前我写了一个慢 SQL 分析工具&#xff0c;可以用来分析 Java Mybatis 项目的 SQL 执行情况&#xff0c;其中刚好涉及到了 explain 的使用。感兴趣的可以了解一下。 Github 地址⭐&#xff1a;https://…

【C#】学习获取程序执行路径,Gemini 帮助分析

一、前言&#xff1a; 在Delphi中&#xff0c;如果想要获取当前执行程序的目录&#xff0c;程序代码如下&#xff1a; ExtractFilePath(ParamStr(0)); 今天在分析一个别人做的C#程序时看到了一段C#代码&#xff0c;意思是获取执行程序所在的文件目录&#xff1a; public stat…

基于区块链的Web 3.0关键技术研讨会顺利召开

基于区块链的Web3.0关键技术研讨会 2024年4月23日&#xff0c;由国家区块链技术创新中心主办的“基于区块链的web3.0关键技术研讨会”召开。Web3.0被用来描述一个运行在“区块链”技术之上的“去中心化”的互联网&#xff0c;该网络上的主体掌握自己数据所有权和使用权&#xf…

【回眸】git VS repo 区别

git VS repo 区别 1. git&#xff1a;Git是一个开源的分布式版本控制系统&#xff0c;用以有效、高速的处理从很小到非常大的项目版本管理。 2. Repo: Repo是谷歌用Python脚本写的调用git的一个脚本,Repo实现管理多个git库。 Git 常用命令 1. git init&#xff1a;在当前目…

【原创】java+springboot+mysql企业邮件管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…