当前位置: 首页 > news >正文

react使用谷歌人机验证

在项目中,需要对请求验证,防止被爆破,这里使用的是谷歌的recaptcha-v3。

1.申请谷歌人机验证的api

申请链接,申请完后需要将两个谷歌颁发的key分别写入前,后端的配置环境中,后面会使用.

 2.前端部分

 前端使用的是vite+CRA框架,先放出配置.

vite全局环境配置(vite.config.js)(环境配置记录,验证请看下面).
import { defineConfig, loadEnv } from 'vite'
import ViteTestConfig from './config/vite.test.config.js'
import ViteBaseConfig from './config/vite.base.config.js'// 策略模式做一个动态的配置
const envResolver = {"build": () => {console.log("生产环境")return ({ ...ViteTestConfig, ...ViteBaseConfig })},"serve": () => {console.log("开发环境")// 另一种写法// return Object.assign({}, ViteBaseConfig, ViteDevConfig)return ({ ...ViteTestConfig, ...ViteBaseConfig })}}// https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => {const env = loadEnv(mode, process.cwd(), "")console.log("env : ", env)// 根据不同的环境使用不同的配置文件,注意这个地方的写法,非常的奇特return envResolver[command]()}
)

这里使用动态配置vite的环境,vite的config文件,当前使用的是本地开发环境使用的是vite.test.config.js,其他环境按这样引用就好了,环境配置比如host,prot,dir等等都在自己需要的环境config中配置就行了.

同时还需要配置环境变量,环境变量使用.env文件,这里我创建了个env文件夹然后将环境变量都放进去了,需要在vite的环境配置中告诉其环境变量文件位置.

import react from "@vitejs/plugin-react"
import { defineConfig } from "vite"
export default defineConfig({plugins: [react()],envDir: 'src/env',
})

同时也分各种不同的环境变量配置,格式为:.env.(环境名称) 例如:..env.development

而.env则是默认的环境变量,也可以理解为全局变量,不管你加不加载都会读取其中的变量.

而vite中的变量命名必须以 VITE_ 开头,否则不会读取

例子:

VITE_TEST_BASE_URL="http://127.0.0.1:8080/api"

在react中读取变量(react数据共享)

react讲究一个纯函数,所以变量声明只能在其组件中使用,这就有一个问题,当我们使用主题或者存储用户token的时候就不能在所有组件中共享,如果一个个传递下去非常麻烦,所以需要使用到react提供的useContext.

1.创建一个context载体组件

// AppContext.js
import React from 'react'const AppContext = React.createContext()export default AppContext

2.在父组件中使用

function App() {
// 主题模式const [styleMode, setStyleMode] = React.useState('light')//改变页面主题const changeMode = () => {const newMode = styleMode === 'dark' ? 'light' : 'dark'setStyleMode(newMode)localStorage.setItem('theme', newMode)}//主题const customTheme = createTheme({palette: {mode: styleMode,},})<ThemeProvider theme={customTheme}><AppContext.Providervalue={{ mode: styleMode, changeMode }}>{ElementRouter}</AppContext.Provider></ThemeProvider>
}

使用该方式可以将变量在被包裹的组件中使用,同时也可以传递函数,对父组件中的数据进行修改。

3.子组件调用

直接使用useContext(载体组件名)即可获得变量

//获取全局变量

const { mode, changeMode } = useContext(AppContext)

//获取环境变量

const variable= import.meta.env.定义的环境变量名

在前端引入recaptcha v3

这里使用封装好的组件引入,npm安装

npm install react-google-recaptcha-v3

v2的话需要自己去找一下引入方式,此方法只适合v3.

引入后在需要引入谷歌验证的父组件上对子组件进行包裹,这里我直接放在APP组件上,直接全部使用了.

function App{return (<ThemeProvider theme={customTheme}><GoogleReCaptchaProviderreCaptchaKey={import.meta.env.VITE_GOOGLE_CAPCHAT_KEY}//国内谷歌验证useRecaptchaNet={true}><AppContext.Providervalue={{ mode: styleMode, baseUrl: baseUrl, changeMode }}>{ElementRouter}</AppContext.Provider></GoogleReCaptchaProvider></ThemeProvider>)
}

key就是你申请到的前端key(client),useRecaptchaNet一定要开,不开的话会去访问谷歌的verifty,局域网内是无法访问的.

使用的话v3使用的是一个无感验证,不需要用户去进行图片或者人机验证点击,所以直接封装一个验证逻辑后放入代码中就好了(比如提交表单的时候或者点击某些按钮的时候等等)

import { requestSlimpePost } from "./RequestUtils"async function checkRobot (executeRecaptcha, baseUrl) {//人机验证不可用情况if (!executeRecaptcha) {alert('人机验证不可用,请检查网络!')return false}//获得验证tokenconst capChatToken = await executeRecaptcha()//获取token失败if (!capChatToken) {alert('人机验证失败!')return false}//封装成json数据const data = {capChatToken: capChatToken,}const jsonData = JSON.stringify(data, null, 2)//获取返回数据const res = await requestSlimpePost(baseUrl + '/verify/recapchat', jsonData)if (res.msg != 'ok' || res.code != 200) {alert('人机验证失败!')console.log(res)return false}return true
}export { checkRobot }

其中requestSlimpePost是我自己封装的请求工具,就使用fetch就不过多介绍了.

 const { executeRecaptcha } = useGoogleReCaptcha()const { baseUrl } = React.useContext(AppContext)const handleSubmit = async (event) => {event.preventDefault()//获取当前登录数据const userInputData = new FormData(event.currentTarget)const userName = userInputData.get('userName')const passwd = userInputData.get('passwd')if (!userName) {alert('用户名不能为空')return}if (!passwd) {alert('密码不能为空')return}const notRobot = await checkRobot(executeRecaptcha, baseUrl)if (!notRobot) return}

先通过封装的包中获取executeRecaptcha这个对象,然后通过调用其中函数向谷歌验证申请验证令牌,拿到后再通过后端携带该令牌去进行评测.

3.后端部分

在前端获取验证令牌后,需要向后端申请验证,后端则向谷歌申请该次人机验证的评分,并进行逻辑操作.

/*** @author Vermouth* @ClassName: ReCapChatManager* @Description: 人机校验管理器* @Date 2024/4/10 11:05* @Version: V1.0*/
@Component
public class ReCapChatManager {// 请求地址private static final String SITEVE_RIFY = "https://www.recaptcha.net/recaptcha/api/siteverify";private static OkHttpClient httpClient = new OkHttpClient();@Autowiredprivate ReCapIpManager reCapIpManager;// 从配置文件中读取到后端key@Value("${recaptcha.server-key}")private String serverKey;/*** 人机校验** @param request 请求包装类* @return true / false* @throws IOException*/public boolean robotCheck(HttpServletRequest request) throws IOException {//请求的IPString remoteAddr = RequestUtils.getClientIp(request);String requestJson = StringUtils.bufferToString(request.getReader());JsonObject requestObj = JsonParser.parseString(requestJson).getAsJsonObject();//异常的请求也驳回if (null == requestObj) {this.addFreezeIp(remoteAddr);return false;}//请求体设置RequestBody formBody = new FormBody.Builder().add("secret", this.serverKey)  //服务端key.add("response", requestObj.get("capChatToken").getAsString())   //客户端提交的token//.add("remoteip", remoteAddr)  //客户的ip地址,不是必须的参数。.build();//请求头设置Headers reqHeaders = new Headers.Builder().add(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded;charset=UTF-8").add(HttpHeaders.CONTENT_LENGTH, String.valueOf(formBody.contentLength())).build();//装入请求中Request reRequest = new Request.Builder().url(SITEVE_RIFY).headers(reqHeaders).post(formBody).build();Call call = httpClient.newCall(reRequest);String responseData = null;try {//发起请求Response googleResponse = call.execute();//检查是否获取到响应体if (null == googleResponse.body()) throw new IOException();responseData = googleResponse.body().string();} catch (IOException e) {throw new SystemException(ExceptionStatus.OKHTTP_CALL_EXCEPTION_);}JsonObject jsonObject = JsonParser.parseString(responseData).getAsJsonObject();//TODO 后续有了服务器还需接入Cloudflare!!!!// 是否执行成功if (!jsonObject.get("success").getAsBoolean()) {// 在失败的情况下,获取到异常状态码JsonArray errorCodes = jsonObject.get("error-codes").getAsJsonArray();this.addFreezeIp(remoteAddr);return false;}//获取评分double score = jsonObject.get("score").getAsDouble();if (score < 0.5) {// 如果低于0.5分,服务不接受该请求this.addFreezeIp(remoteAddr);return false;}return true;}/*** 冻结ip操作** @param ipAddress 需冻结ip*/public void addFreezeIp(String ipAddress) {reCapIpManager.freezeIp(ipAddress);}}

需要注意的是请求地址,请求地址同样也必须是国内的谷歌验证api,否则访问不到.

一般来说打分都是在0.9,我自己测试的都是在0.9,可以根据自己的情况来调整判断人机的分数.

相关文章:

react使用谷歌人机验证

在项目中&#xff0c;需要对请求验证&#xff0c;防止被爆破&#xff0c;这里使用的是谷歌的recaptcha-v3。 1.申请谷歌人机验证的api 申请链接,申请完后需要将两个谷歌颁发的key分别写入前&#xff0c;后端的配置环境中&#xff0c;后面会使用. 2.前端部分 前端使用的是viteC…...

java JMH 学习

JMH 是什么&#xff1f; JMH&#xff08;Java Microbenchmark Harness&#xff09;是一款专用于代码微基准测试的工具集&#xff0c;其主要聚焦于方法层面的基准测试&#xff0c;精度可达纳秒级别。此工具由 Oracle 内部负责实现 JIT 的杰出人士编写&#xff0c;他们对 JIT 及…...

本地运行AI大模型简单示例

一、引言 大模型LLM英文全称是Large Language Model&#xff0c;是指包含超大规模参数&#xff08;通常在十亿个以上&#xff09;的神经网络模型。2022年11月底&#xff0c;人工智能对话聊天机器人ChatGPT一经推出&#xff0c;人们利用ChatGPT这样的大模型帮助解决很多事情&am…...

图像处理:时域、空域、频率的滤波介绍

首先要搞清楚为什么会呈现出不同域的维度&#xff0c;来理解和处理图像&#xff0c;原因是图像的构成有多个维度的信息特点。比如一段视频从时间顺序来看&#xff0c;相邻的2个图像帧绝大部分信息是相同的&#xff0c;这就构成了前向预测的理论基础&#xff1b;比如一帧图像从空…...

TC8002D 是一颗带关断模式的音频功放IC

一、一般概述 TC8002D是一颗带关断模式的音频功放IC。在5V输入电压下工作时&#xff0c;负载(3Ω)上的平均功率 为3 W&#xff0c;且失真度不超过10%。而对于手提设备而言&#xff0c;当VDD作用于关断端时&#xff0c;TC8002D将会进入关断模式&#xff0c;此时的功耗极…...

深度学习之基于Vgg19预训练卷积神经网络图像风格迁移系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在数字艺术和图像处理领域&#xff0c;图像风格迁移技术一直备受关注。该技术可以将一幅图像的内容和…...

MySQL:多表查询练习

#1.出版社信息 与 图书信息 交叉连接 select * from 出版社信息 cross join 图书信息; #2.从“客户信息”和“订单信息”两张数据表中查询购买了商品的客户信息&#xff0c;要求查询结果显示客户姓名、订单编号、订单状态。 select 客户信息.客户姓名,订单信息.订单编号,订单…...

# 从浅入深 学习 SpringCloud 微服务架构(八)Sentinel(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;八&#xff09;Sentinel&#xff08;1&#xff09; 一、sentinel&#xff1a;概述 1、前言 – 服务熔断 Hystrix 的替换方案。 1&#xff09;2018年底 Netflix 官方宣布 Hystrix 已经足够稳定&#xff0c;不再积极开发 Hys…...

[微信小程序] 入门笔记2-自定义一个显示组件

[微信小程序] 入门笔记2-自定义一个显示组件 0. 准备工程 新建一个工程,删除清空app的内容和其余文件夹.然后自己新建pages和components创建1个空组件和1个空页面. 设定 view 组件的默认样式,使其自动居中靠上,符合习惯.在app.wxss内定义,作用做个工程. /**app.wxss**/ /* 所…...

YOLO代码复现

睿智的目标检测66——Pytorch搭建YoloV8目标检测平台_pytorch_quantization yolov8-CSDN博客 Mask rcnn代码实现_pytorch版_适用30系列显卡_mask rcnn 30显卡-CSDN博客 完整且详细的Yolov8复现训练自己的数据集-CSDN博客...

使用fitten code插件(vscode),替换通义千问,识别需求中的输入输出

今天我们介绍一个工具,具体介绍可以参考我的这篇文章的介绍,支持vs code 插件,Fitten Code是一款由非十科技开发的AI代码助手,旨在通过大模型驱动来提升编程效率和体验-免费神器-CSDN博客https://blog.csdn.net/lijigang100/article/details/137833223?spm=1001.2014.3001…...

vue使用pdfjs-dist在电脑上展示PDF文件

安装 安装的时候一定要带上版本号,这里采用的是2.0.943(因为这个版本对于我目前的项目比较合适可以正常使用,其他版本大概率会报错),当前项目使用的是vue2,vue的版本是2.5.10 npm install pdfjs-dist@2.0.943 查看版本发现这玩意版本非常之多 使用 在使用pdfjs-dist库…...

【网站项目】戒烟网站

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

慢性软组织疼痛如何使用DMS深层肌肉刺激仪进行治疗?

使用DMS深层肌肉刺激仪治疗慢性软组织疼痛&#xff0c;可以遵循以下步骤&#xff1a; 准备工作&#xff1a;首先&#xff0c;确保DMS设备已经充电或插上电源&#xff0c;并根据需要调整振动强度和频率。DMS深层肌肉刺激仪是通过快速连续的振动和打击来刺激深层肌肉的设备&#…...

自动化测试常用工具

自动化测试工具是非常重要的。自动化测试工具可以帮助程序员提高工作效率&#xff0c;减少重复劳动和人为错误&#xff0c;提高产品质量。下面我将介绍几个常用的自动化测试工具。 Selenium&#xff1a;Selenium是一个开源的自动化测试框架&#xff0c;用于Web应用程序的自动化…...

【Osek网络管理测试】[TG4_TC4]tWaitBusSleep

🙋‍♂️ 【Osek网络管理测试】系列💁‍♂️点击跳转 文章目录 1.环境搭建2.测试目的3.测试步骤4.预期结果5.测试结果1.环境搭建 硬件:VN1630 软件:CANoe 2.测试目的 验证DUT的tWBS时间参数是否符合NM标准 本处规定tWBS在[1350ms,1650ms]范围内符合要求 3.测试步骤…...

java08基础(值传递和引用传递 类和对象)

目录 一. 值传递和引用传递 1. 值传递 2. 引用传递 二. 面向对象思想 三. 类和对象 1. 类 2. 对象 2.1 使用 2.2 成员变量和局部变量区别 2.3 操作成员方法 2.4 this关键字(初识) 2.5 构造方法 (见java09) 一. 值传递和引用传递 1. 值传递 值传递是指在调用函数时将…...

高级数据结构与算法习题(9)

一、判断题 1、Let S be the set of activities in Activity Selection Problem. Then the earliest finish activity am​ must be included in all the maximum-size subset of mutually compatible activities of S. T F 解析:F。设S是活动选择问题中的一…...

Linux的vim下制作进度条

目录 前言&#xff1a; 回车和换行有区别吗&#xff1f; 回车和换行的区别展示&#xff08;这个我在Linux下演示&#xff09; 为什么会消失呢? 回车和换行的区别 为什么\r和\n产生的效果不同&#xff1f; 打印进度条&#xff1a; &#xff08;1&#xff09;打印字符串 …...

C++学习笔记2

T1 奇怪的教室 题目背景 LSU 的老师有个奇怪的教室&#xff0c;同学们会从左到右坐成一个横排&#xff0c;并且同一个位置可以坐多个同学。这天&#xff0c;入学考试的成绩下来了。同学们想根据入学考试的成绩&#xff0c;找出班里学霸扎堆的区域“学霸区”。 题目描述 共有…...

MissionPlanner地面站调试Pixhawk:除了基础校准,你的F450还能设置这些高级功能

MissionPlanner地面站进阶指南&#xff1a;解锁Pixhawk飞控的隐藏潜力 当你已经能够熟练完成F450无人机的基础校准&#xff0c;让四轴稳稳升空只是起点而非终点。MissionPlanner作为Pixhawk飞控的瑞士军刀&#xff0c;藏着许多被普通教程忽略的进阶功能——这些功能往往决定着你…...

智能卡开发实战:ISO7816 APDU命令与响应全解析(附常见错误码对照表)

智能卡开发实战&#xff1a;ISO7816 APDU命令与响应全解析&#xff08;附常见错误码对照表&#xff09; 第一次接触智能卡开发时&#xff0c;我被APDU通信的严谨性震撼到了——这就像在和一个极度注重礼仪的外交官对话&#xff0c;任何格式错误都会导致沟通中断。作为嵌入式工程…...

Comsol 锂枝晶耦合应力模型探索

comsol锂枝晶耦合应力模型 耦合了浓度场电势场应力场 Comsol锂枝晶模拟-相场法加应力 复现参考文献&#xff1a;《How Does External Pressure Shape Li Dendrites in Li Metal Batterie 利用相场法耦合&#xff1a;化学场、电势场、浓度场、应力场。在锂离子电池研究领域&…...

XC7Z100与GMSL FMC采集卡在自动驾驶视觉系统中的高效集成方案

1. XC7Z100与GMSL FMC采集卡的核心价值 在自动驾驶视觉系统中&#xff0c;图像采集的实时性和可靠性直接决定了系统的性能上限。XC7Z100 FPGA与GMSL FMC采集卡的组合&#xff0c;就像给系统装上了"超清眼睛"和"高速神经"。我曾参与过一个夜间自动驾驶项目&…...

探索时序并行门控网络TPGN:RNN的崭新继任者

一种RNN的新继任者—时序并行门控网络TPGN&#xff0c;用于时间序列预测。 作为RNN的新继任者。 PGN通过设计的历史信息提取&#xff08;HIE&#xff09;层直接从以前的时间步捕获信息&#xff0c;并利用门通机制选择并将其与当前时间步信息融合。 这将信息传播路径减少到0(1)&…...

别再只盯着find提权了!盘点Linux下5种更隐蔽的权限维持姿势与排查手册

超越find提权&#xff1a;Linux系统下5种高阶权限维持技术与深度排查指南 当攻击者成功获取Linux系统权限后&#xff0c;权限维持&#xff08;Persistence&#xff09;往往成为攻防对抗的核心战场。传统安全培训常聚焦于SUID提权等基础手段&#xff0c;但真实APT攻击中&#xf…...

Vue 过滤器详解及 Vue 3 中的替代方案

Vue 过滤器详解及 Vue 3 中的替代方案 一、Vue 过滤器的核心概念与特性 Vue 过滤器&#xff08;Filter&#xff09;是 Vue 2.x 提供的用于数据格式化转换的机制&#xff0c;其核心设计理念是不修改原始数据&#xff0c;仅对显示层进行格式化处理。过滤器本质上是纯函数&#xf…...

Cadence启动文件背后的设计哲学:为什么.cdsinit总覆盖不了.cdsenv的设置?

Cadence启动文件背后的设计哲学&#xff1a;为什么.cdsinit总覆盖不了.cdsenv的设置&#xff1f; 当你在Cadence Virtuoso中反复调整波形显示参数&#xff0c;却发现每次重启后设置都被重置时&#xff0c;背后隐藏的是一套精妙的EDA工具配置体系。这个看似简单的"设置失效…...

猫抓插件:5分钟掌握浏览器视频下载终极指南

猫抓插件&#xff1a;5分钟掌握浏览器视频下载终极指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经遇到过想要保存网页视频却找不到下载按钮的烦恼&#xff1f;或者想收藏在线音乐却只…...

华为/荣耀手机鸿蒙系统安装谷歌地图、Gmail等App的保姆级教程(无需复杂框架)

华为鸿蒙手机零门槛畅玩谷歌生态&#xff1a;GBOX全攻略手册 刚入手华为Mate60系列或升级到HarmonyOS 4.0的用户&#xff0c;面对无法直接使用Google Maps、Gmail这些国际应用的困境时&#xff0c;往往陷入两难——既需要这些工具的全球服务&#xff0c;又担心第三方安装包的安…...