在Vue3中使用谷歌reCaptcha v2验证

前言:reCaptcha验证就是登录前,巨烦人的那个人机验证。最近新创建的项目需要加入这个功能,使用的是复选框验证,本篇也是对这个进行展开记录。

将会遇到的问题:

  1. 国内如何使用reCaptcha验证?
  2. 需要搭梯子(文明上网)访问google的reCaptcha创建密钥

1、创建密钥

点击前往官网reCaptcha(梯子访问), 登录谷歌账号

然后可以根据以下步骤进行:

按照描述填好,然后点击提交

这里就可以获取到密钥,这里选择的是客户端集成的(看项目需要),所以复制了这个密钥,再分析完成后,可以点击转到设置

这里还可以对配置信息进行编辑,一般我会收藏这个设置的网址,方便后续打开修改配置信息。

进行到这里,就拿到了密钥了。

2、封装

当然,github上查找vue reCaptcha也可以查找到别人封装好的,但是,在项目上,不太好随便去安装别人的依赖。

访问链接可以查看具体配置信息。

首先,reCaptcha密钥目前是个人的,需要更换,且属于项目中的隐私数据,所以采取在env文件里面存放。

前提:vue3 + vite;

js 复制代码
# 开发环境.env.development(生产环境也是这样配置.env.production)
# 访问方式:import.meta.env
# 配置方式:VITE_ 开头
VITE_API_SITEKEY='复制下来的密钥'

在vue3项目里面的index.html文件加入

js 复制代码
//需要梯子
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
//文件介绍说是全球都可以访问,但是在国内,我访问失败了
<script src="https://www.recaptcha.net/recaptcha/api.js" async defer></script>
//最后,试了一下,下面这个是可以访问到的
<script src="//recaptcha.net/recaptcha/api.js" async defer></script>

展示一下index.html

js 复制代码
<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <link rel="shortcut icon" type="image/svg+xml" href="/favicon.png" />
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no,user-scalable=no" />
        <title>PayExcel</title>
    </head>
    <body>
        <div id="app"></div>
        <script type="module" src="/src/main.js"></script>
        <script src="//recaptcha.net/recaptcha/api.js" async defer></script>
    </body>
</html>

文件引入完成后,可以进行封装,创建reCaptcha.vue文件,将这个文件导入到要渲染的位置就可以了。

js 复制代码
<template>
    <div id="grecaptcha"></div>
</template>

<script setup>
import { onMounted } from "vue";

const props = defineProps({
    sitekey: {//密钥
        type: String,
        required: true,
    },
    size: {//大小
        type: String,
        default: "normal",
    },
    theme: { //主题风格 dark
        type: String,
        default: "light",
    },
    hl: { //语言
        type: String,
        default: "zh",
    },
    delay: { //这个延迟是因为要等待引入的script文件生效
        type: Number,
        default: 200,
    },
});

const emits = defineEmits(["verify", "expire", "fail"]);

const expireCallback = function () {
    emits("expire"); 
};
const failCallback = function () {
    emits("fail");
};
const verifyCallback = function (token) {
    emits("verify", token); //这个是返回的token,给后端去处理。
};

const onloadCallback = function () {
    setTimeout(() => {
        if (window.grecaptcha?.render) {
            window.grecaptcha.render("grecaptcha", {
                //根据reCaptcha的配置
                sitekey: props.sitekey,
                theme: props.theme,
                hl: props.hl,
                size: props.size,
                "expired-callback": expireCallback,
                "error-callback": failCallback,
                callback: verifyCallback,
            });
        }
    }, props.delay);
};

onMounted(() => {
    onloadCallback();
});
</script>

<style lang="less" scoped></style>

3、常见问题处理

可以直接访问官网,点击链接就可以查看,收集的问题还是挺全的,相信能够找到属于你的解决方法。

相关推荐
ywf121512 小时前
前端的dist包放到后端springboot项目下一起打包
前端·spring boot·后端
恋猫de小郭12 小时前
2026,Android Compose 终于支持 Hot Reload 了,但是收费
android·前端·flutter
hpoenixf18 小时前
2026 年前端面试问什么
前端·面试
还是大剑师兰特18 小时前
Vue3 中的 defineExpose 完全指南
前端·javascript·vue.js
泯泷19 小时前
阶段一:从 0 看懂 JSVMP 架构,先在脑子里搭出一台最小 JSVM
前端·javascript·架构
mengchanmian19 小时前
前端node常用配置
前端
华洛20 小时前
利好打工人,openclaw不是企业提效工具,而是个人助理
前端·javascript·产品经理
xkxnq20 小时前
第六阶段:Vue生态高级整合与优化(第93天)Element Plus进阶:自定义主题(变量覆盖)+ 全局配置与组件按需加载优化
前端·javascript·vue.js
A黄俊辉A21 小时前
vue css中 :global的使用
前端·javascript·vue.js
小码哥_常21 小时前
被EdgeToEdge适配折磨疯了,谁懂!
前端