uniCloud ---- uni-captch实现图形验证码

这篇具有很好参考价值的文章主要介绍了uniCloud ---- uni-captch实现图形验证码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

用途说明

组成部分

目录结构

原理时序

云端一体组件介绍

验证码配置(可选):

普通验证码组件

公共模块

云函数公用模块

项目实战 

创建云函数

创建注册页 

创建云函数

关联公用模块 uni-captcha

刷新验证码

 自定义实现 验证码

获取验证码

刷新验证码

校验验证码


下载地址:uni-captcha - DCloud 插件市场

GitCode 仓库:uniCaptcha: 基于uniCloud的验证码模块

用途说明

主要起到人机校验或其他限制调用的作用,如:

  • 防止机器冒充人类做暴力破解
  • 防止大规模在线注册滥用服务
  • 防止滥用在线批量操作
  • 防止信息被大量采集聚合

常见的业务场景有:

  • 注册环节:防止无效垃圾注册,从源头进行管理
  • 登录环节:防止撞库攻击、暴力破解,保障用户数据
  • 短信防刷:减少短信接口被刷情况,减少企业不必要成本
  • 互动环节:防止批量垃圾互动信息,破坏用户UGC内容生态
  • 激励领取:防止被批量褥羊毛

组成部分

  1. 数据表:opendb-verify-codes,用于存储验证码相关数据
  2. 公共模块:uni-captcha,集成获取、刷新、校验验证码
  3. 云对象:uni-captcha-co,集成获取验证码的api
  4. 云端一体组件:uni-captchauni-popup-captcha,集成创建、刷新、显示验证码

目录结构

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器

原理时序

  1. 客户端,向服务端请求某一应用场景的验证码。提示:这里用场景值scene,表示应用场景,用于防止不同功能的验证码混用,如:loginpay
  2. 服务端,创建验证码,即:向数据表opendb-verify-codes中创建状态为待验证的验证码记录(作废同一个设备id和场景值的旧验证码记录),并返回格式为base64的图形验证码资源数据。提示:这里的数据表,状态字段名:state0表示待验证,用2表示已作废。
  3. 客户端,得到验证码图片,用户识别后输入验证码的值与表单数据一起提交至服务端
  4. 服务端,云函数或clientDB action中校验验证码,决定是否执行业务逻辑。如果验证码错误则返回错误信息,客户端再重复步骤1-3。提示:验证验证码,可以使用封装好的公共模块的verify方法详情,也可以直接查库校验。

以上即完整的流程。 如果在前端表单页面中,使用本插件封装好的云端一体组件,并配置组件的属性场景值scene,即等价于如上步骤1-3;

本插件已集成使用示例,使用HBuilderX导入示例项目体验;另外你也可以参考插件在uni-starter中的应用

云端一体组件介绍

内置调用uni-captcha-co云对象集成创建/刷新验证码,组件支持双向数据绑定。

验证码配置(可选):

参数说明:

字段 类型 默认值 说明
width Number 150 图片宽度
height Number 40 图片高度
background String #FFFAE8 验证码背景色,设置空字符''不使用背景颜色
size Number 4 验证码长度,最多 6 个字符
noise Number 4 验证码干扰线条数
color Boolean false 字体是否使用随机颜色,当设置background后恒为true
fontSize Number 40 字体大小
ignoreChars String 忽略哪些字符
mathExpr Boolean false 是否使用数学表达式
mathMin Number 1 表达式所使用的最小数字
mathMax Number 9 表达式所使用的最大数字
mathOperator String 表达式所使用的运算符,支持 +-。不传则随机使用
expiresDate Number 180 验证码过期时间(s)
scene Object 根据场景值配置(版本号:0.6.0+ 支持)

普通验证码组件

组件名:uni-captcha

组件遵从easycom组件规范

使用示例:

<template>
	<uni-captcha scene="场景值" v-model="验证码的值"></uni-captcha>
</template>

Props:

字段 类型 必填 默认值 说明
scene String - 使用场景值,用于防止不同功能的验证码混用,如:loginpay
value/v-model String - - 验证码的值

公共模块

  • 云端一体组件uni-captchauni-popup-captcha,已经集成公共模块的获取验证码create和刷新验证码refresh接口。
  • 引入公共模块请参考云函数公用模块
云函数公用模块

云函数支持公共模块。多个云函数的共享部分,可以抽离为公共模块,然后被多个云函数引用。

版本要求:HBuilderX 2.6.6+

以下面的目录结构为例,介绍一下如何使用。

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器

 新建并引入公用模块

  1. cloudfunctions目录下创建common目录
  2. common目录右键创建公用模块目录(本例中为hello-common,见下方示例图),会自动创建入口index.js文件和package.json不要修改此package.json的name字段
  3. hello-common右键上传公用模块
  4. 在云函数上右键选择管理公共模块依赖,添加依赖的公共模块

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器

公共模块依赖其他公共模块同理

注意事项

  • 如果要更新所有依赖某公用模块的云函数,可以在common目录下的公用模块目录(本例中为hello-common)右键选择更新依赖本模块的云函数
  • 公用模块命名不可与nodejs内置模块重名
  • 从插件市场导入或者其他地方复制项目可能会导致npm install创建的软链接失效,如果遇到这种情况请删除node_modulespackage-lock.json重新npm install

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器

使用公用模块

仍以上面的目录为例,在公用模块内exports,在云函数内require即可。示例代码如下:

// common/hello-common/index.js
function getVersion() {
  return '0.0.1'
}
module.exports = {
  getVersion,
  secret: 'your secret'
}
// use-common/index.js
'use strict';
const {
  secret,
  getVersion
} = require('hello-common')
exports.main = async (event, context) => {
  let version = getVersion()
  return {
    secret,
    version
  }
}

项目实战 

创建云函数

我们来创建uni-captcha云函数,如下图右击cloudfunctions,选择新建云函数/云对象。

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器

弹出如下图后,我们选择uni-captcha即可,点击确认。 、

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器

然后cloudfunctions中,则会生成common/uni-captcha和uni-captcha-co两个模块。

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器​ 

创建注册页 

云函数都创建成功后,我们实现一个简单的登录页面,如下图:

博主 from表单使用了  uview 可以换成 uni-ui

uView - 多平台快速开发的UI框架 - uni-app UI框架

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器

<template>
	<view class="container">
		<view class="wrapper">
			<view class="title">
				用户注册
			</view>
			<view class="input-content">
				<u-form :model="form" ref="uForm">
					<u-form-item label="手机" prop="Phone">
						<u-input placeholder="请输入手机号" v-model="form.Phone" />
					</u-form-item>
					<u-form-item label="密码" prop="Password">
						<u-input type="password" placeholder="请输入密码" v-model="form.Password" />
					</u-form-item>
					<u-form-item label="密码" prop="Password1">
						<u-input type="password" placeholder="确认密码" v-model="form.Password1" />
					</u-form-item>
					<u-form-item prop="captcha" label="验证码" label-width="100rpx">
						<uni-captcha :scene="form.scene" v-model="form.captcha"></uni-captcha>
					</u-form-item>
				</u-form>
			</view>
			<button class="confirm-btn" @click="register()">注册</button>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				// 校验规则
				rules: {
					Phone: [{
							required: true,
							message: '请输入手机号',
							// 可以单个或者同时写两个触发验证方式 
							trigger: ['change', 'blur'],
						},
						{
							// 自定义验证函数,见上说明
							validator: (rule, value, callback) => {
								// 上面有说,返回true表示校验通过,返回false表示不通过
								// this.$u.test.mobile()就是返回true或者false的
								return this.$u.test.mobile(value);
							},
							message: '手机号码不正确',
							// 触发器可以同时用blur和change
							trigger: ['change', 'blur'],
						}
					],
					Password: [{
							required: true,
							message: '请输入密码',
							// 可以单个或者同时写两个触发验证方式 
							trigger: ['change', 'blur'],
						},
						{
							min: 6,
							message: '密码不能少于5个字',
							trigger: 'change'
						}
					],
					Password1: [{
							required: true,
							message: '请输入确认密码',
							// 可以单个或者同时写两个触发验证方式 
							trigger: ['change', 'blur'],
						},
						{
							// 自定义验证函数,见上说明
							validator: (rule, value, callback) => {
								// 上面有说,返回true表示校验通过,返回false表示不通过
								// this.$u.test.mobile()就是返回true或者false的
								return value === this.form.Password
							},
							message: '两次密码不一致',
							// 触发器可以同时用blur和change
							trigger: ['change', 'blur'],
						}
					],
					captcha: [{
						required: true,
						message: '请输入验证码',
						// 可以单个或者同时写两个触发验证方式 
						trigger: ['change', 'blur'],
					}]

				},

				form: {
					Phone: '',
					Password: '',
					Password1: '',
					scene: "register",
					captcha: ""
				},

			}
		},
		// 必须要在onReady生命周期,因为onLoad生命周期组件可能尚未创建完毕
		onReady() {
			console.log("执行");
			this.$refs.uForm.setRules(this.rules);
		},
		methods: {

			register() {
				this.$refs.uForm.validate(valid => {
					if (valid) {

						let data = {
							...this.form
						}

						uniCloud.callFunction({
							name: "register",
							data: data
						}).then(res => {
							console.log(res);
							if (res.result.code == 0) {
								this.$u.toast('注册成功');
								setTimeout(() => {
									uni.navigateBack()
								}, 300)

							} else {
								this.form['scene'] = 'register' + Math.random();
								this.$u.toast(res.result.message);
							}
						})

					} else {
						console.log('验证失败');
					}
				});
			}
		},
	}
</script>

/* <style lang='scss'>
	.container {
		padding-top: 50px;
		width: 100vw;
		height: 100vh;
		background: #fff;
	}

	.wrapper {
		background: #fff;
		padding-bottom: 40upx;
	}


	.title {
		text-align: center;
		margin-bottom: 100rpx;
		font-size: 46upx;
		color: #555;
		text-shadow: 1px 0px 1px rgba(0, 0, 0, .3);
	}

	.input-content {
		padding: 0 60upx;
	}

	.input-item {
		display: flex;
		flex-direction: column;
		align-items: flex-start;
		justify-content: center;
		padding: 0 30upx;
		background: $page-color-light;
		height: 120upx;
		border-radius: 4px;
		margin-bottom: 50upx;

		&:last-child {
			margin-bottom: 0;
		}

		.tit {
			height: 50upx;
			line-height: 56upx;
			font-size: $font-sm+2upx;
			color: $font-color-base;
		}

		input {
			height: 60upx;
			font-size: $font-base + 2upx;
			color: $font-color-dark;
			width: 100%;
		}
	}

	.confirm-btn {
		width: 630upx;
		height: 76upx;
		line-height: 76upx;
		border-radius: 50px;
		margin-top: 70upx;
		background: $uni-theme-color;
		color: #fff;
		font-size: $font-lg;

		&:after {
			border-radius: 100px;
		}
	}

	.forget-section {
		font-size: $font-sm+2upx;
		color: $uni-theme-color;
		text-align: center;
		margin-top: 40upx;
	}

	.captcha_box {
		.input {}

		.captcha {
			width: 240rpx;
			height: 72rpx;
		}
	}
</style>

创建云函数

此时我们创建一个云函数,用于对表单中输入的验证码,进行校验其是否正确。还是在cloudfunctions上右击,选择“新建云函数/云对象”,如下图:

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器

 点击创建后,cloudfunctions中会生成云函数。如下图:

 uniCloud ---- uni-captch实现图形验证码,java,前端,服务器

 此时可以在index.js中添加图形验证码校验功能,返回校验结果。代码如下:

'use strict';
//导入验证码公共模块
const uniCaptcha = require('uni-captcha')
const db = uniCloud.database();



exports.main = async (event) => {
	const { Phone, Password, scene, captcha } = event;

	try {
		// 校验验证码
		let res = await uniCaptcha.verify({ scene, captcha })
		// 验证通过
		if (res.code == 0) {
			// 校验是否已经注册
			const userExists = await db.collection("User").where({ Phone: Phone }).get();
			if (userExists.data.length !== 0) {
				return {
					code: 1,
					message: "该账号已注册",
				};
			}
			// 添加用户
			await db.collection("User").add({
				time: Date.now(),
				Phone: Phone,
				Password: Password,
			});
			return {
				code: 0,
				message: "注册成功"
			};
		} else {
			// 验证失败
			return {
				code: -1,
				message: res.errMsg || res.message || "验证码异常",
			};
		}
	} catch (error) {
		// 出现异常
		console.error('添加用户失败:', error);
		return {
			code: -1,
			message: "注册失败,请稍后重试",
		};
	}




};

关联公用模块 uni-captcha

在云函数上鼠标右击,选择”管理公共模块或扩展库依赖“

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器

选择”uni-captcha“公共模板,点击确认。

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器

刷新验证码


另外,我们发现如果验证码错误后,显示的验证码不会自动刷新。由于这里我们使用的是uni-app的扩展UI组件,功能不好升级维护,如果觉得此组件不好用,也可以自己使用uni-captcha-co获取验证进行个性化操作。

这里主要是为了演示,就先在原基本上完成刷新功能。打开uni_modules目录,找到uni-captcha组件,再打开components目录中的uni-captcha,我们来看下内部是如何实现的。

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器

如上图所示,我们发现应用场景发生改变后,验证码会重新获取。所以上文中这样做的

加入随机数让其变化

uniCloud ---- uni-captch实现图形验证码,java,前端,服务器


 

 自定义实现 验证码

获取验证码

用于新的验证码记录(使用云端一体组件的用户可以忽略)

//引入公共模块
const uniCaptcha = require('uni-captcha')
module.exports = {
	async createCaptcha({scene}) {
		return await uniCaptcha.create({
			scene,
			width:100,
			height:44
		});
	}
}

参数说明

字段 类型 必填 默认值 说明
scene String - 使用场景值,用于防止不同功能的验证码混用,如:loginpay
deviceId String - - 设备 id,如果不传,将自动从 uniCloud 上下文获取
uniPlatform String - - uni-app 运行平台
width Number - 150 图片宽度
height Number - 40 图片高度
background String - #FFFAE8 验证码背景色,设置空字符''不使用背景颜色
size Number - 4 验证码长度,最多 6 个字符
noise Number - 4 验证码干扰线条数
color Boolean - false 字体是否使用随机颜色,当设置background后恒为true
fontSize Number - 40 字体大小
ignoreChars String - '' 忽略哪些字符
mathExpr Boolean - false 是否使用数学表达式
mathMin Number - 1 表达式所使用的最小数字
mathMax Number - 9 表达式所使用的最大数字
mathOperator String - '' 表达式所使用的运算符,支持 +-。不传则随机使用
expiresDate Number - 180 验证码过期时间(s)

注意:

  • uni-captcha 0.3.0起,支持在unicloud配置中心uni-config-center->uni-captcha->config.json中配置参数默认值
  • 如果想替换字体,请保证字体格式为 .ttf 且包含 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+- 字符

响应参数

字段 类型 说明
errCode Number 错误码,0 表示成功
errMsg String 详细信息
captchaBase64 String 验证码:base64 格式

刷新验证码

作废相同设备id和场景值的验证码记录,并创建新的验证码记录(使用云端一体组件的用户可以忽略)

//引入公共模块
const uniCaptcha = require('uni-captcha')
const db = uniCloud.database();
const verifyCodes = db.collection('opendb-verify-codes')
module.exports = {
	async refreshCaptcha({scene}) {
		let res = await verifyCodes.where({scene,deviceId,state:0}).limit(1).get()
		if(res.data.length){
			return await uniCaptcha.refresh({
				scene,
				width:100,
				height:44
			});
		}else{
			return {
				errCode: "uni-captcha-refresh-fail",
				errMsg: '未找到相同设备id和场景值的有效验证码记录'
			}
		}
	}
}

参数说明

字段 类型 必填 默认值 说明
scene String - 类型,用于防止不同功能的验证码混用
deviceId String - - 设备 id,如果不传,将自动从 uniCloud 上下文获取

响应参数

字段 类型 说明
errCode Number 错误码,0 表示成功
errMsg String 详细信息
captchaBase64 String 验证码:base64 格式

注意:文章来源地址https://www.toymoban.com/news/detail-797920.html

  • 支持传入 create 方法的所有参数,如果不传,则自动按照 deviceId 匹配上次生成时的配置生成新的验证码

校验验证码

用于验证用户输入的验证码是否正确

const uniCaptcha = require('uni-captcha')
module.exports = {
	async verify({scene,captcha}) {
		let res = await uniCaptcha.verify({scene,captcha})
		if(res.code == 0){
			//...这里写你的业务逻辑
		}else{
			return res
		}
	}
}

参数说明

字段 类型 必填 默认值 说明
scene String - 类型,用于防止不同功能的验证码混用
captcha String - 验证码
deviceId String - - 设备 id,如果不传,将自动从 uniCloud 上下文获取

响应参数

字段 类型 说明
errCode Number 错误码,0 表示成功
errMsg String 详细信息

注意:

  • 若提示验证码失效,请重新获取
  • 如果为了更小的代码体积,不想使用本方法,也可以直接查库校验

到了这里,关于uniCloud ---- uni-captch实现图形验证码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决uni-app uniCloud小程序预览没有数据

    例如:最近小程序的项目是用uni-app写的,项目用uniCloud作为后端,原本以为unicloud跟微信小程序云开发差不多,但是预览到手机的时候没有数据了…… unicloud作为后端,手机预览没有数据,通过查阅文献和网搜,进行了一系列的排查。 跟以往的微信云开发不同,unicloud作为后

    2024年02月09日
    浏览(34)
  • 微信小程序实现图形验证码登陆+手机验证码登陆

    前端界面如下:

    2024年01月16日
    浏览(25)
  • ASP.NET-实现图形验证码

    ASP.NET 实现图形验证码能够增强网站安全性,防止机器人攻击。通过生成随机验证码并将其绘制成图像,用户在输入验证码时增加了人机交互的难度。本文介绍了如何使用 C# 和 ASP.NET 创建一个简单而有效的图形验证码系统,包括生成随机验证码、绘制验证码图像以及将图像输

    2024年02月21日
    浏览(29)
  • Android Studio实现图形验证码

    源代码 源代码MainActivity 效果图32行需要修改,不修改会报错:需要常量表达式,我的代码已修改 点击后 MainActivity RxCaptcha activity_main.xml

    2024年02月13日
    浏览(28)
  • SpringBoot整合Kaptcha实现图形验证码

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:SpringBoot实战 以下是专栏部分内容,更多内容请前往专栏查看! 标题 一文带你学会使用SpringBoot+Avue实现短信通知功能

    2024年02月08日
    浏览(43)
  • SpringBoot实现图形验证码功能+访问频率设置+缓存

    目录 1、springboot实现图形验证码生成 1.1、导入Maven依赖 1.2、写一个生成图片的工具类 1.3、编写接口生成验证码并存入Redis 2、实现图形验证码判断是否正确 2.1、编写验证图形验证码接口 2.2、前端代码 2.3、请求发送 3、实现访问频率限制 3.1、创建自定义注解 3.2、创建自定义

    2024年04月17日
    浏览(28)
  • SpringBoot+原生awt,实现花花绿绿的图形验证码

    图形验证码是用于验证用户身份的一种方式 ,通常在网站注册、登录或进行某些敏感操作时会使用。它通过展示一个包含随机字符或数字的图形,要求用户输入相应的字符或数字来证明其为真人而非机器人。图形验证码能有效地防止机器人攻击和恶意注册行为,提高网站的安

    2024年02月07日
    浏览(31)
  • spring boot3登录开发-2(1图形验证码接口实现)

    ⛰️个人主页:     蒾酒 🔥系列专栏:《spring boot实战》 🌊 山高路远,行路漫漫,终有归途。 目录 前置条件 内容简介 图形验证码接口实现 导入糊涂工具依赖 接口分析 编写验证码接口 测试验证码接口 本文衔接上文,请从上文开始 spring boot3x登录开发-上(整合jwt)-CSDN博客

    2024年02月20日
    浏览(36)
  • uni-sec-check内容安全unicloud公共模块,校验微信小程序文本内容安全识别和图片智能鉴黄,uniapp进阶

    uni-sec-check内容安全是unicloud封装了微信小程序的免费接口,文本内容安全识别(msgSecCheck)和音视频内容安全识别(mediaCheckAsync),如果我没选择使用uniapp+unicloud开发的话,可以轻松从插件市场引入uni-sec-check公共模块,完成内容安全检测,包含图片和文字检测,下面就针对文

    2024年02月04日
    浏览(35)
  • 【vue】vue前端、生产(线上)环境请求unicloud云服务空间axios报错

    使用axios的时候,如果是开发环境下,WebStorm(IDEA)会自带跨域功能,说白了就是不用考虑跨域的事情了。但是在生产环境下,vue前端编译成静态文件,只是普通的http请求,所以根据浏览器的跨域规则(域名、端口、协议,一个不同就是跨域),不能发送请求,所以要借助反

    2024年02月07日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包