uniapp实现加密Token并在每次请求前动态更新(vue、微信小程序、原生js也通用!)

导语:在Web开发中,Token作为一种身份验证的机制,被广泛应用于前后端交互过程中。本文将为大家介绍如何在每次请求前动态设置加密的Token,并在请求一次后使Token值加1(或其他动态改变的逻辑),从而提高系统的安全性。

一、背景知识

  1. Token简介 Token是一种身份验证的令牌,通常由服务器生成,客户端在每次请求时携带Token,服务器通过验证Token的有效性来判断请求是否合法。

  2. 为什么要动态设置Token? 动态设置Token可以有效防止恶意请求,提高系统的安全性。通过在每次请求前更新Token,即使Token被泄露,也无法在下次请求中使用。

  3. 为什么Token要加密?Token是用户身份的凭证,如果Token在传输过程中被截获,攻击者可能会利用这个Token进行非法操作。因此,对Token进行加密是提高系统安全性的重要措施。

二、实现思路

  1. 生成初始Token 在用户登录成功后,服务器生成一个初始Token并使用CryptoJS加密,并将其发送给客户端。

  2. 客户端存储Token客户端在收到Token后,将其存储在本地(如localStorage、cookie等)。

  3. 每次请求前更新Token 在发起请求前,客户端从本地获取Token并使用CryptoJS解密,并将其值加1,然后再加密后更新本地存储的Token。

  4. 服务器验证Token 服务器在接收到请求后,验证Token的有效性。若Token有效,则处理请求;否则,拒绝请求。

三、具体实现

以下是在uniapp中的实现示例代码,如果你用的是Vue、微信小程序或者原生js也都是通用的,逻辑思路都一样,只是实现代码有些许差别。

1、安装CryptoJS

bash 复制代码
npm install crypto-js

2、在utils文件夹中新建一个获取token的js文件

javascript 复制代码
import CryptoJS from 'crypto-js'
import {
	BASE_URL
} from './request.js'
// 解密函数
function decryptAES(encryptedMessage, secretKey) {
	var bytes = CryptoJS.AES.decrypt(encryptedMessage, secretKey);
	return bytes.toString(CryptoJS.enc.Utf8);
}


// 加密函数,包含配置项
function encryptAES(message, secretKey) {
	let config = {
		mode: CryptoJS.mode.CBC,
		padding: CryptoJS.pad.Pkcs7,
		iv: CryptoJS.enc.Utf8.parse('你的密钥')
	};
	return CryptoJS.AES.encrypt(message, secretKey, config).toString();
}

// 获取token
export const getToken = () => {
	return new Promise(async (resolve, reject) => {
		const TOKEN= getCookie('TOKEN')
        // 如果没有,就先从后端获取
		if (!TOKEN) {
			try {
			 const token = await getTokenFromServer()
             setCookie('TOKEN', token)
             resolve(token)
			} catch (e) {
				reject(e)
			}
		}
		const key = CryptoJS.enc.Utf8.parse('你的密钥');
		const token= encryptAES(TOKEN, key)
		resolve(token)
	})

}

// 从后端获取Token
function getTokenFromServer() {
	return new Promise((resolve, reject) => {
		uni.request({
			url: BASE_URL + '/auth/terminals',
			method: 'get',
			success: (res) => {
				resolve(res.data)
			},
			fail: (err) => {
				console.log(err)
				reject(err)
			}
		})
	})

}

// 获取cookie
function getCookie(name) {
	let arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
	if (arr = document.cookie.match(reg)){
        let res = decryptAES(arr[2],'你的密钥')
		setCookie(name, ++res)
			return unescape(res);
	}
	else{
		return null
	}
		
}

// 设置cookie(不设置过期时间)
function setCookie(name, value) {
	document.cookie = name + "=" + escape(value);
}

3、在发送请求的文件中引入使用

javascript 复制代码
import {getToken} from './getToken.js'

...
...
uni.request({
				url: BASE_URL + url, //请求路径
				data: data, //请求参数
				method: item, //请求方法
				header: { //请求头
					RequestId: await getToken(),  // 此处动态获取token并设置请求头
					 ...config.header
				},
				// 成功
				success: function(res) {}
            })
相关推荐
Amumu1213814 分钟前
Js:正则表达式(一)
开发语言·javascript·正则表达式
小江的记录本24 分钟前
【Linux】《Linux常用命令汇总表》
linux·运维·服务器·前端·windows·后端·macos
无人机9011 小时前
Delphi 网络编程实战:TIdTCPClient 与 TIdTCPServer 类深度解析
java·开发语言·前端
lUie INGA2 小时前
rust web框架actix和axum比较
前端·人工智能·rust
OPHKVPS2 小时前
VoidStealer新型窃密攻击:首例利用硬件断点绕过Chrome ABE防护,精准窃取v20_master_key
前端·chrome
月光宝盒造梦师2 小时前
Ant Design Ellipsis 中的判断逻辑 isEleEllipsis 方法非常消耗性能
javascript·react·优化
gechunlian883 小时前
SpringBoot3+Springdoc:v3api-docs可以访问,html无法访问的解决方法
前端·html
驾驭人生3 小时前
ASP.NET Core 实现 SSE 服务器推送|生产级实战教程(含跨域 / Nginx / 前端完整代码)
服务器·前端·nginx
酉鬼女又兒3 小时前
零基础快速入门前端ES6 核心特性详解:Set 数据结构与对象增强写法(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯·es6
慧一居士3 小时前
Vue项目中,子组件调用父组件方法示例,以及如何传值示例,对比使用插槽和不使用插槽区别
前端·vue.js