uni-app使用uniCloud实现图形验证码(uni-captcha)

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

uniCloud 是 DCloud 联合阿里云、腾讯云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台。

官方文档:https://uniapp.dcloud.net.cn/uniCloud/uni-captcha.html

下载地址:https://ext.dcloud.net.cn/plugin?id=4048

GitCode 仓库:https://gitee.com/dcloud/uni-captcha

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

  • 防止机器冒充人类做暴力破解

  • 防止大规模在线注册滥用服务

  • 防止滥用在线批量操作

  • 防止信息被大量采集聚合

常见的业务场景有:

  • 注册环节:防止无效垃圾注册,从源头进行管理

  • 登录环节:防止撞库攻击、暴力破解,保障用户数据

  • 短信防刷:减少短信接口被刷情况,减少企业不必要成本

  • 互动环节:防止批量垃圾互动信息,破坏用户UGC内容生态

  • 激励领取:防止被批量褥羊毛

组成部分

  • 数据表:opendb-verify-codes,用于存储验证码相关数据

  • 公共模块:uni-captcha,集成获取、刷新、校验验证码

  • 云对象:uni-captcha-co,集成获取验证码的api

  • 云端一体组件:uni-captcha和uni-popup-captcha,集成创建、刷新、显示验证码

原理时序

  1. 客户端,向服务端请求某一应用场景的验证码。提示:这里用场景值scene,表示应用场景,用于防止不同功能的验证码混用,如:login、pay

  1. 服务端,创建验证码,即:向数据表opendb-verify-codes中创建状态为待验证的验证码记录(作废同一个设备id和场景值的旧验证码记录),并返回格式为base64的图形验证码资源数据。提示:这里的数据表,状态字段名:state用0表示待验证,用2表示已作废。

  1. 客户端,得到验证码图片,用户识别后输入验证码的值与表单数据一起提交至服务端

  1. 服务端,云函数或clientDB action中校验验证码,决定是否执行业务逻辑。如果验证码错误则返回错误信息,客户端再重复步骤1-3。提示:验证验证码,可以使用封装好的公共模块的verify方法详情,也可以直接查库校验。

一、创建Demo

首先我们创建一个uni-app的demo,来演示功能效果。首先打开HBuilderX,选择:文件->新建->项目->uni-app,选择模板uni-ui项目,如下图:

uni-app使用uniCloud实现图形验证码(uni-captcha)

二、创建云函数

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

uni-app使用uniCloud实现图形验证码(uni-captcha)
uni-app使用uniCloud实现图形验证码(uni-captcha)

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

uni-app使用uniCloud实现图形验证码(uni-captcha)

然后cloudfunctions中,则会生成common/uni-captcha和uni-captcha-co两个模块。这时我们先到此为止,后续使用到云函数再作详解。

uni-app使用uniCloud实现图形验证码(uni-captcha)

此时别忘记将其上传部署,分别将1,2,3三项右击选择上传。

uni-app使用uniCloud实现图形验证码(uni-captcha)

三、创建login登录页

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

uni-app使用uniCloud实现图形验证码(uni-captcha)

这里我们使用普通验证码组件uni-captcha,代码如下:

<template>
    <view class="login-wrap">
        <uni-forms ref="form" :modelValue="formData" :rules="rules">
            <uni-forms-item required label="账号" name="name">
                <uni-easyinput type="text" v-model="formData.name" placeholder="请输入姓名" />
            </uni-forms-item>
            <uni-forms-item required label="密码" name="password">
                <uni-easyinput type="password" v-model="formData.password" placeholder="请输入姓名" />
            </uni-forms-item>
            <uni-forms-item required name="captcha" label="验证码">
                <uni-captcha :scene="formData.scene" v-model="formData.captcha"></uni-captcha>
            </uni-forms-item>
        </uni-forms>
        <button type="primary" @click="submitForm">登录</button>
    </view>
</template>

<script>
    export default {
        data() {
            return {
                formData:{
                    captcha:"",
                    scene:"login"
                },
                rules: {}
            }
        },
        methods: {
            submitForm(){
                
            }
        }
    }
</script>

<style lang="scss">
.login-wrap{ 
    padding: 30rpx;
}
</style>

四、表单校验

uni-forms 需要通过 rules 属性传入约定的校验规则。如果你对uni扩展组件还不了解的,可以去官网查看。

地址:https://uniapp.dcloud.net.cn/component/uniui/uni-forms.html

4.1 必填校验

data中rules添加表单中字段必填项,代码如下:

rules: {
    name: {
        rules: [
            { required: true, errorMessage: '请输入姓名' }
        ]
    },
    password: {
        rules: [
            { required: true, errorMessage: '请输入密码' }
        ]
    },
    captcha: {
        rules: [
            { required: true, errorMessage: '请输入验证码' }
        ]
    }
}

然后在methods方法中,给提交函数添加表单校验执行函数,代码如下:

submitForm(){
    this.$refs.form.validate().then(res=>{
        console.log('表单数据信息:', res);
    }).catch(err =>{
        console.log('表单错误信息:', err);
    })
}

此时,点击“登录”按钮,如果未填写任务信息,则表单会提示相应错误,如下图:

uni-app使用uniCloud实现图形验证码(uni-captcha)

4.2 创建云对象

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

uni-app使用uniCloud实现图形验证码(uni-captcha)

点击创建后,cloudfunctions中会生成uni-captcha-demo云对象。如下图:

uni-app使用uniCloud实现图形验证码(uni-captcha)

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

//导入验证码公共模块
const uniCaptcha = require('uni-captcha')
//获取数据库对象
const db = uniCloud.database()
//获取数据表opendb-verify-codes对象
const verifyCodes = db.collection('opendb-verify-codes')
module.exports = {
    async verify({scene,captcha}) {
        let res = await uniCaptcha.verify({scene,captcha})
        return res;
    }
}

同样,uni-captcha-demo云对象完成后,也需要右击选择”上传部署“。

4.3 验证码校验

validateFunction 异步校验:如果需要异步校验,validateFunction 需要返回一个 Promise ,校验不通过 执行 reject(new Error('错误信息')) 返回对应的错误信息,如果校验通过则直接执行 resolve() 即可,在异步校验方法中,不需要使用 callback 。

首先我们在登录页引入云对象,代码如下:

<script>
    //引入uni-captcha-demo云对象
    const uniCaptchaDemoCo = uniCloud.importObject("uni-captcha-demo");
    export default {
        data() {
            return {
                //...
            }
        },
        methods: {
            //...
        }
    }
</script>

在rules中添加异步校验,代码如下:

rules: {
    //...
    
    captcha: {
        rules: [
            { required: true, errorMessage: '请输入验证码' },
            { validateFunction: (rule, value, data, callback) => {
                return new Promise((resolve, reject) => {
                    //调用verify函数进行校验
                    uniCaptchaDemoCo.verify(this.formData).then(e=>{
                        resolve();
                    }).catch(e => {
                        reject(new Error(e.errMsg));
                    });
                })
            } }
        ]
    },
}

五、解决MODULE_NOT_FOUND

以上校验功能已全部完成了,但此时大家会发现,所有信息都填写后,点击“登录“会报如下图错误:

uni-app使用uniCloud实现图形验证码(uni-captcha)

这是因为在创建云对象uni-captcha-demo时,内部使用到了uni-captcha模块,需要将其关联上。在uni-captcha-demo上鼠标右击,选择”管理公共模块或扩展库依赖“

uni-app使用uniCloud实现图形验证码(uni-captcha)

选择”uni-captcha“公共模板,点击确认。然后再次右击uni-captcha-demo选择”上传部署“即可。

uni-app使用uniCloud实现图形验证码(uni-captcha)

以上步骤完成后,我们再次将验证码输入错误,点击”登录“后则会显示”验证码错误“,如下图:

uni-app使用uniCloud实现图形验证码(uni-captcha)

六、刷新验证码

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

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

uni-app使用uniCloud实现图形验证码(uni-captcha)

如上图所示,我们发现应用场景发生改变后,验证码会重新获取。那我们对代码进行如下修改即可,代码如下:

<script>
    const uniCaptchaDemoCo = uniCloud.importObject("uni-captcha-demo");
    //索引
    let index = 0;
    export default {
        data() {
            return {
                formData:{
                    captcha:"",
                    scene:"login"
                },
                rules: {
                    //...
                    
                    captcha: {
                        rules: [
                            { required: true, errorMessage: '请输入验证码' },
                            { validateFunction: (rule, value, data, callback) => {
                                return new Promise((resolve, reject) => {
                                    uniCaptchaDemoCo.verify(this.formData).then(e=>{
                                        resolve();
                                    }).catch(e => {
                                        //修改场景值,重新获取验证码
                                        this.formData['scene'] = 'login'+(++index);        
                                        reject(new Error(e.errMsg));
                                    });
                                })
                            } }
                        ]
                    },
                },
                //rules end
            }
        },
        methods: {
            //...
        }
    }
</script>

七、公共模块

云端一体组件uni-captcha和uni-popup-captcha,已经集成公共模块的获取验证码接口,这里不使用组件模块,直接通过接口获取验证码和校验功能。

在上面创建uni-captcha模块时,已生成了uni-captcha-co云对象。

uni-app使用uniCloud实现图形验证码(uni-captcha)

7.1 获取验证码

uni-captcha-co云函数中,已实现了获取验证码功能,直接调用即可,代码如下:

index.obj.index代码如下:

//导入验证码公共模块
const uniCaptcha = require('uni-captcha')
//获取数据库对象
const db = uniCloud.database();
//获取数据表opendb-verify-codes对象
const verifyCodes = db.collection('opendb-verify-codes');

module.exports = {
    //获取验证码
    async getImageCaptcha({
        scene
    }) {
        //获取设备id
        let {
            deviceId,
            platform
        } = this.getClientInfo();
        //根据:设备id、场景值、状态,查找记录是否存在
        let res = await verifyCodes.where({
            scene,
            deviceId,
            state: 0
        }).limit(1).get();
        //如果已存在则调用刷新接口,反之调用插件接口
        let action = res.data.length ? 'refresh' : 'create';
        //执行并返回结果
        //导入配置,配置优先级说明:此处配置 > uni-config-center
        return await uniCaptcha[action]({
            scene, //来源客户端传递,表示:使用场景值,用于防止不同功能的验证码混用
            uniPlatform: platform
        })
    }
}

将前面登录页面引入的云对象更换成“uni-captcha-co”,然后定义getVerifyImage()函数,获取图形验证码。

公共模块中提供了刷新验证码功能,测试发现设备校验这块,本地模拟测试存在问题,所以这里未使用,有需要的可以自行研究。

页面代码如下:

<template>
    <view class="login-wrap">
        <uni-forms ref="form" :modelValue="formData" :rules="rules">
            <uni-forms-item required label="账号" name="name">
                <uni-easyinput type="text" v-model="formData.name" placeholder="请输入姓名" />
            </uni-forms-item>
            <uni-forms-item required label="密码" name="password">
                <uni-easyinput type="password" v-model="formData.password" placeholder="请输入姓名" />
            </uni-forms-item>
            <uni-forms-item required name="captcha" label="验证码">
                <!-- uni-captch-box -->
                <view class="uni-captch-box">
                    <uni-easyinput type="password" v-model="formData.captcha" placeholder="请输入验证码" />
                    <image class="captcha-img" mode="aspectFill" :src="imgUrl" @click="getVerifyImage"></image>
                </view>
                <!-- /uni-captch-box -->
            </uni-forms-item>
        </uni-forms>
        <button type="primary" @click="submitForm">登录</button>
    </view>
</template>

<script>
    const uniCaptchCo = uniCloud.importObject('uni-captcha-co');
   
    export default {
        data() {
            return {
                imgUrl: "",
                formData:{
                    captcha:"",
                    scene:"login"
                },
                rules: {
                    name: {
                        rules: [
                            { required: true, errorMessage: '请输入姓名' }
                        ]
                    },
                    password: {
                        rules: [
                            { required: true, errorMessage: '请输入密码' }
                        ]
                    },
                    captcha: {
                        rules: [
                            { required: true, errorMessage: '请输入验证码' }
                        ]
                    },
                },
                //rules end
            }
        },
        created() {
            this.getVerifyImage();
        },
        methods: {
            //获取验证码
            getVerifyImage(){
                uniCaptchCo.getImageCaptcha({scene: this.formData.scene}).then(res => {
                    if(res.code==0){
                        this.imgUrl = res.captchaBase64;
                    }else{
                        uni.showToast({
                            icon: 'none',
                            title: res.message
                        });
                    }
                }).catch(e => {});
            },
            //表单校验
            submitForm(){
                this.$refs.form.validate().then(res=>{
                    console.log('表单数据信息:', res);
                    uni.showToast({
                        icon: 'none',
                        title: '校验成功~'
                    });
                }).catch(err =>{
                    // console.log('表单错误信息:', err);
                })
            }
        }
    }
</script>

<style lang="scss">
.login-wrap{ 
    padding: 30rpx;
}

.uni-captch-box{ position: relative; padding-right: 240rpx;
    .captcha-img{ width: 200rpx; height: 70rpx; border: 3rpx solid #F0F0F0; border-radius: 5rpx; position: absolute; top: 0; right: 0; z-index: 10; background-color: #aaa; }
}
</style>

此时,页面布局可以根据需求来实现图形验证,页面效果图下:

uni-app使用uniCloud实现图形验证码(uni-captcha)

7.2校验验证码

把校验验证码功能函数拷到uni-captcha-co/index.obj.js中,代码如下:

// 开发文档: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
//导入验证码公共模块
const uniCaptcha = require('uni-captcha')
//获取数据库对象
const db = uniCloud.database();
//获取数据表opendb-verify-codes对象
const verifyCodes = db.collection('opendb-verify-codes');

module.exports = {
    //校验验证码
    async verify({scene,captcha}) {
        let res = await uniCaptcha.verify({scene,captcha})
        return res;
    },
    //获取验证码
    //...
}

这里将前面实现的rules校验,修改成uni-captcha-co对象uniCaptchCo即可,如下:

rules: {
    //...
    
    captcha: {
        rules: [
            { required: true, errorMessage: '请输入验证码' },
            { validateFunction: (rule, value, data, callback) => {
                return new Promise((resolve, reject) => {
                    //调用verify函数进行校验
                    uniCaptchCo.verify(this.formData).then(e=>{
                        resolve();
                    }).catch(e => {
                        reject(new Error(e.errMsg));
                    });
                })
            } }
        ]
    },
}

以上仅供参考,有更好解决方案,欢迎大家分享!文章来源地址https://www.toymoban.com/news/detail-480296.html

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

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

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

相关文章

  • uni-app-使用tkiTree组件实现树形结构选择

    uni-app-使用tkiTree组件实现树形结构选择

    前言 在实际开发中我们经常遇见树结构-比如楼层区域-组织架构-部门岗位-系统类型等情况 往往需要把这个树结构当成条件来查询数据,在PC端可以使用Tree,table,Treeselect等组件展示 在uni-app的内置组件中似乎没有提供这样组件来展示,但是是有第三方包tkiTree组件来解决这个

    2024年02月14日
    浏览(34)
  • uni-app使用uview-ui实现动态更改底部tabbar

    需求:根据不同的权限(用户 0, 物业 1)展示不同的tabbar 这里使用的是uview-ui@1.8.4 tabbar 在utils文件夹下新建一个tabbar.js文件,来存储不同权限下的底部导航数据 在page.json文件里,把tabbar里的几个页面去重放进去tabBar。 使用vuex 新建store 文件夹存储相关数据 在入口文件 mai

    2024年02月12日
    浏览(17)
  • 微信小程序使用uni-app开发小程序及部分功能实现详解心得

    目录 一、uni-app 1、简介 2、开发工具 3、新建 uni-app项目 4、把项目运行到微信开发者工具 二、实现tabBar效果 1、创建tabBar页面 2、配置tabBar 1、创建分包目录 2、在 pages.json 文件中配置 3、创建分包页面 四、公用方法封装 五、搜索功能 1、搜索组件 2、搜索建议实现 3、本地存储

    2024年02月11日
    浏览(9)
  • 在uni-app中使用sku插件,实现商品详情页规格展示和交互。

    在uni-app中使用sku插件,实现商品详情页规格展示和交互。

    学会使用插件市场,下载并使用 SKU 组件,实现 商品详情页 规格展示和交互。 SKU 概念 存货单位(Stock Keeping Unit),库存管理的最小可用单元,通常称为“单品”。 SKU 常见于电商领域,对于前端工程师而言,更多关注 SKU 算法 和 用户交互体验 。 uni-app 插件市场,是 uni-ap

    2024年01月19日
    浏览(11)
  • 关于uni-app中uni-forms表单验证时“多级结构对象数据”如何做数据校验的解决方案

    关于uni-app中uni-forms表单验证时“多级结构对象数据”如何做数据校验的解决方案

    这几天在做uni-app表单验证时遇到了一个问题,按官方文档给出的方法,当需要数据校验时,只需要 1.为uni-forms中的\\\" modelValue \\\"数据设置“ :rules ”对应 2.“ uni-forms-item ”的name和“ uni-easyinput ”中“v-model”中的key和“ rules ”中的key相同 就可以对该项“uni-easyinput”做数据校验

    2023年04月09日
    浏览(92)
  • 【uni-app】uni-app实现聊天页面功能——功能篇(上)

    【uni-app】uni-app实现聊天页面功能——功能篇(上)

    上一篇讲到了如何布局,这一篇将讲一下如何用uni-app实现小程序聊天页面的最主要的功能——发消息后页面滚动到最底部(参考过很多文章最后找到比较适合的方法)。 其他的功能(参考微信),之后的文章会讲述到具体实现方法 点击聊天框的时候,聊天框随键盘抬起且聊

    2024年02月11日
    浏览(15)
  • 【uni-app】uni-app实现聊天页面功能(小程序)——布局篇

    【uni-app】uni-app实现聊天页面功能(小程序)——布局篇

    在工作中使用uni-app参与开发一个小程序,其中要写一个简单的聊天页面,虽然功能不多(只有一个发送文字的功能),但是其中的细节比较多,也踩过很多坑,特此记录下来。要实现的页面如图所示,该篇主要讲讲如何布局(参考了很多文章之后根据页面需求进行一个整合)

    2024年02月05日
    浏览(209)
  • 不同平台使用不同技术实现微信好友、朋友圈分享汇总(H5、taro、uni-app)

    不同平台使用不同技术实现微信好友、朋友圈分享汇总(H5、taro、uni-app)

    人生路漫漫,坑,是活久了见。程序猿世界里各种奇葩的需求都有,随之而来的各种坑也是层出不穷。 应前IBM同事邀请特来做分享的专题总结。一般人我不告诉他,刷到的朋友们就赚到了,你懂的~~~~~~收藏吧!   事情前情概述,昨天IBM的同事前来咨询我怎样实现微信分享功

    2024年02月15日
    浏览(38)
  • 小程序-uni-app:hbuildx uni-app 安装 uni-icons 及使用

    小程序-uni-app:hbuildx uni-app 安装 uni-icons 及使用

    一、官方文档找到uni-icons uni-app官网 二、下载插件 三、点击“打开HBuildX” 四、选择要安装的项目 五、勾选要安装的插件 六、安装后,项目插件目录 根目录uni_modules目录下增加uni-icons、uni-scss 七、引入组件,使用组件 八、经过测试,成功。 参考链接 http://lihuaxi.xjx100.cn/new

    2024年02月12日
    浏览(45)
  • 【uni-app】uni-app中scroll-into-view的使用

    【uni-app】uni-app中scroll-into-view的使用

    在使用的时候需要注意: 需要给sroll-view组件设置宽或者高(根据横纵情况) white-space:nowrap 这行代码让组件能够滑动(之前自己写的时候踩的坑) 使用 scroll-into-view ,需要开启动画效果,并且动态绑定的值必须是字符串 并且子组件的上绑定一个id值用于定位 以上就是今天要讲的内容,

    2024年02月11日
    浏览(8)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包