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.hqwc.cn/news/702952.html

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

相关文章

【Linux系统编程】基本指令(二)

目录 1、mv指令 2、cat指令 输出重定向 ​编辑 追加重定向 输入重定向 3、more指令 4、less指令 5、head指令 6、tail指令 与时间相关的指令 7、date指令 8、cal指令 9、find指令 10、grep指令 11、zip/unzip指令 1、mv指令 mv文件是用来对文件或目录进行重命名…

又一款爆火AI游戏诞生!《换你来当爹》做对了什么?| ShowMeAI体验报告

社区里几百人玩一款AI游戏的场面,值得记录一下! 大模型游戏化极度看重〖有趣〗程度。 可有趣的灵魂那么难得,以至于只要一眼,我们就在产品的海洋里发现了 ta 。 1. 有趣的灵魂在发疯疯疯 《换你来当爹》是一款全员发疯的AI游戏&am…

中腾食品上海食堂承包创新食堂空间,构建企业第三文化沙龙

在快节奏的现代职场生活中,企业食堂已不再是简单的餐饮供应地,而是逐渐演变成为员工休息休闲、互动体验、阅读思考的重要场所。中腾国际团餐产业集团通过专业的定制化食堂承包,在企业食堂内部打造企业第三文化空间,为员工提供一个…

Qt初识

Qt初识 1. Qt 背景介绍 1.1 什么是 Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单…

MySQL和吉客云单据接口对接

MySQL和吉客云单据接口对接 源系统:吉客云 杭州吉客云网络技术有限公司是经国家认定的高新技术企业,是国内领先的SaaSERP软件服务商,致力于为企业提供安全稳定、高可用性和高扩展性的一站式数字化解决方案。 写入目标:MySQL MySQL是最流行的数据库之一&a…

MIT 6.5840(6.824) Lab2:Key/Value Server 设计实现

1 实验要求 在本次 Lab 中,你将在单机上构建一个键/值服务器,以确保即使网络出现故障,每个操作也只能执行一次,并且操作是可线性化的。 客户端可以向键/值服务器发送三个不同的 RPC: Put(key, value) 、 Append(key,…

39-5 入侵检测系统(IDS)- 安装配置IDS(安装成功)

官网:Snort Rules and IDS Software Download 参考: (这位大佬分享了安装包下载链接):https://www.cnblogs.com/taoyuanming/p/12722263.html (安装过程参考这位大佬):Snort 安装与配置(CentOS 7)_centos 7 snort-CSDN博客一、安装 IDS(我这里在 CentOS 7 虚拟机中安…

python数据分析——数据可视化(图形绘制基础)

数据可视化(图形绘制基础) 前言一、图形绘制基础Matplotlib简介使用过程sin函数示例 二、常用图形绘制折线图的绘制plot示例 散点图的绘制plot示例 柱状图的绘制bar示例 箱型图绘制plot.box示例 饼状图的绘制pie示例 三、图形绘制的组合情况多个折线图的…

【Stable Diffusion】 训练方法篇

一、四种模型训练方法简介 Stable Diffusion 有四种训练模型的方法:Textual Inversion、Hypernetwork、LoRA 和 Dreambooth 。它们的训练方法存在一定差异,我们可以通过下面对比来评估使用哪种训练方式最适合你的项目。 如果你知道模型中已经可以产生你…

Git系列:git add 被忽视的操作技巧

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【Python探索之旅】元组

元组的作用 遍历 修改 元组运算符 索引和切片 加法运算符 重复运算符 比较运算符 完结撒花 前言 元组(tuple)是一种静态的(immutable)或者说是不可变(unchangeable)的数据结构,里面的元素按照一定的顺序排列。它是静态的,所以元组里的元素不能被…

刷代码随想录有感(65):回溯算法——组合问题

题干&#xff1a; 代码&#xff1a; class Solution { public:vector<vector<int>> res;vector<int> tmp;void backtracking(int n, int k, int start){if(tmp.size() k){res.push_back(tmp);return;}for(int i start; i < n; i){tmp.push_back(i);bac…