前端安全验证码实现原理SDK模块



前端必备工具推荐网站(免费图床、API和ChatAI等实用工具):
http://luckycola.com.cn/

前言

验证码:是一种校验区分用户是计算机还是人的公共全自动程序。
作用:防止刷票、论坛灌水、刷页、防止黑客恶意破解密码、盗取用户数据和防止恶意注册登录等等

介绍

1、该验证码模块基于原生typescript实现前端sdk模块,webpack打包.

2、集主流的“点选验证码”、“拼图验证码”、“转图验证码”为一体,结合组合模式、策略模式、外观模式等主流设计模式设计,大大提高产品性能和体验

3、后端策略服务基于node实现,支持自定义服务端策略验证.


一、效果展示

在线效果展示地址:点击即可跳转>>>

二、使用步骤

1.引入库

  1. 引入http://luckycola.com.cn/public/sources/mlvcode/api/built.js 文件
  2. 在需要的地方初始化
  3. 参考在线demo:
    http://demo.luckycola.com.cn/mlvcode/index.html
    代码如下(示例):
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>验证码</title>
</head>
<body>
    <!-- <div id="myVcodeContainer" style="width: 700px;height: 700px; background-color: aqua;overflow: hidden;"></div> -->
    <script>
        window.onload = function() {
            let localhttp = location.protocol + '//' + location.host;
            let mlVcode = boostrapFn({
                    // 验证码类型
                    vcodeType: ['puzzleVcode', 'clickVcode', 'roateVcode'],
                    // vcodeType: 'roateVcode',
                    // 模式 弹窗模式 嵌入模式(default)
                    mode: 'dialog',
                    // 验证key,请前往官网(http://luckycola.com.cn/)获取
                    colaKey: '7bl41678875299610wesqdwedKFep',
                    // 当前网站是否为https
                	isHttps: false,
                    // 验证码模块容器  传id  字符串
                    container: '#myVcodeContainer1',
                    // clickVcodeConfig: {
                    //     fontList: '姐姐姐姐姐姐介绍岁',
                    //     imgList: [
                    //         '1111'
                    //     ]
                    // },
                    // puzzleVcodeConfig: {
                    //     // 拼图形状 'puzzle' | 'rect' | 'round' | 'triangle'
                    //     puZshape: 'puzzle',
                    //     // 提示文案
                    //     puZoperateTip: '请拖动完成拼图验证',
                    //     puZimgList: [
                    //         '22222'
                    //     ]
                    // },
                    roateVcodeConfig: {
                        // 提示文案
                        roateOperateTip: '请拖动将图片转正完成验证',
                        roateimgList: [
                        ]
                    },
                    customTxt: {
                        headerConfig: {
                            text: '登录安全验证',
                            url: 'http://durobot.baidu.com/public/robotWeb/index.html'
                        },
                        footerConfig: {
                            text: '关于百度',
                            url: 'https://home.baidu.com/'
                        }
                    },
                    // 是否开启server验证 默认不开启
                    serverVerify: false,
                    // 自定义后端验证的接口配置
                    collectionDataOptios: {
                        // 开启服务端验证接口自定义 且 serverVerify=true时生效
                        open: false,
                        //自定义数据上报接口 必须post方式
                        postUrl: `${localhttp}/mlvcode`,
                        //自定义数据上报接口调用钩子
                        postUrlFn: function(resData) {
                             // resData是自定义接口响应的内容
                            console.log('postUrlFn....resData:', resData)
                        },
                        // 自定义初始化接口 必须post方式
                        initpostUrl: `${localhttp}/initmlvcode `,
                        // 自定义初始化接口调用的钩子函数
                        postInitUrlFn: function(initSuccessHook, resData) {
                            // resData是自定义接口响应的内容
                            console.log('postInitUrlFn resData:', resData);
                            // resData.data.code = -1
                            if (resData.data.code === 0) {
                                // 如果初始化成功 请调用initSuccessHook完成数据采集监听
                                initSuccessHook();
                                console.log('postInitData....ok')
                            } else {
                                console.log('postInitData....fail')
                            }
                        },
                        // 自定义后端验证接口
                        verifypostUrl: `${localhttp}/mlvcode`,
                        // 自定义后端验证接口调用钩子
                        verifypostUrlFn: function(resData, verifySuccessHook, verifyFailHook) {
                            console.log('verifypostUrlFn....resData:', resData);
                            if (resData.data.code === 0) {
                                // 如果自定义验证接口验证成功 调用verifySuccessHook钩子让验证码展示通过状态(前提是前端验证也已经通过了)
                                verifySuccessHook();
                            } else {
                                // 如果自定义验证接口验证不成功 调用verifyFailHook钩子让验证码展示失败状态
                                verifyFailHook()
                            }
                        },
                        // 自定义请求参数前置拦截函数(在中国函数中,您可以根据您的需求对请求中的明文数据进行加密等行为)
                        // 注意:该配置仅在serverVerify=true和collectionDataOptios=>open=true两项配置开启时生效
                        apiDataPreFn: function(apiData) {
                            // apiData 是请求的参数 处理后请务必return 出该函数 否则你的处理将不会生效
                            console.log('apiDataPreFn执行啦....apiData:', apiData, apiData.data);
                            let myApiParams = apiData.data;
                            // 我这里是对特定接口的请求参数进行扩展,您也可以进行加密等操作
                            if (/\/initmlvcode/g.test(apiData.url)) {
                                myApiParams.test = '这是测试数据';
                            }
                            // 我更改下请求数据
                            apiData.data = myApiParams;
                            return apiData;
                        },
                    },
                    successFn: (rsp) => {
                        console.log('自定义成功回调函数执行...', mlVcode);
                        // mlVcode.switchShowVcode('hide');
                    },
                    failFn: (rsp) => {
                        console.log('自定义失败回调函数执行...');
                    },
                    renderSucFn(rsp) {
                        console.log('自定义失render调函数执行...');
                    },
            }).render();
        };
    </script>
</body>
</html>

注意!!!: 如果您还没有Colakey,请先请前往官网获取
官网地址:http://luckycola.com.cn/

2.参数说明

参数是否必须说明
colaKeystring唯一的验证key,请前往官网(http://luckycola.com.cn/)获取
isHttpsboolean当前网站是否为https
vcodeTypestring或Array验证码类型,现在支持点选验证码(clickVcode)、转图验证码(roateVcode)和拼图验证码(puzzleVcode),但是数组写法时随机出数组种配置的验证码
modedialog或者不填默认不填是嵌入模式, dialog是弹窗模式,两种模式都可以指容器
containerstring验证码容器id
serverVerifyboolean是否开启服务器验证策略,默认不开
clickVcodeConfigobject点选验证码自定义配置,object具体参数在表后说明
puzzleVcodeConfigobject拼图验证码自定义配置,object具体参数在表后说明
roateVcodeConfigobject转图验证码自定义配置,object具体参数在表后说明
customTxtobject验证码容器自定义配置 , object具体参数在表后说明
collectionDataOptiosobject自定义服务端验证的接口配置 , object具体参数在表后说明
// 点选验证码自定义配置
  clickVcodeConfig: {
         fontList: '姐姐姐姐姐姐介绍岁',
          // 点选验证码的背景图片列表,值必须是url
         imgList: []
     },
// 拼图验证码自定义配置
     puzzleVcodeConfig: {
         // 拼图形状 'puzzle' | 'rect' | 'round' | 'triangle'
         puZshape: 'puzzle',
         // 提示文案
         puZoperateTip: '请拖动完成拼图验证',
         // 拼图的图片列表,值必须是url
         puZimgList: []
     },
// 转图验证码自定义配置
    roateVcodeConfig: {
        // 提示文案
        roateOperateTip: '请拖动将图片转正完成验证',
        // 转图的图片列表,值必须是url
        roateimgList: [
        ]
    },
// 验证码容器自定义配置
 customTxt: {
         // 容器标题配置
        headerConfig: {
            text: '登录安全验证',
            url: 'http://durobot.baidu.com/public/robotWeb/index.html'
        },
        // 容器footer配置
        footerConfig: {
            text: '关于百度',
            url: 'https://home.baidu.com/'
        }
    },




// ---------如果你开启了服务端验证(serverVerify=true)请使用自己的服务端的验证接口---------


// 自定义后端验证的接口配置
   collectionDataOptios: {
       // 开启服务端验证接口自定义 且 serverVerify=true时生效
       open: false,
       //自定义数据上报接口 必须post方式
       postUrl: `${localhttp}/mlvcode`,
       //自定义数据上报接口调用钩子
       postUrlFn: function(resData) {
            // resData是自定义接口响应的内容
           console.log('postUrlFn....resData:', resData)
       },
       // 自定义初始化接口 必须post方式
       initpostUrl: `${localhttp}/initmlvcode `,
       // 自定义初始化接口调用的钩子函数
       postInitUrlFn: function(initSuccessHook, resData) {
           // resData是自定义接口响应的内容
           console.log('postInitUrlFn resData:', resData);
           // resData.data.code = -1
           if (resData.data.code === 0) {
               // 如果初始化成功 请调用initSuccessHook完成数据采集监听
               initSuccessHook();
               console.log('postInitData....ok')
           } else {
               console.log('postInitData....fail')
           }
       },
       // 自定义后端验证接口
       verifypostUrl: `${localhttp}/mlvcode`,
       // 自定义后端验证接口调用钩子
       verifypostUrlFn: function(resData, verifySuccessHook, verifyFailHook) {
           console.log('verifypostUrlFn....resData:', resData);
           if (resData.data.code === 0) {
               // 如果自定义验证接口验证成功 调用verifySuccessHook钩子让验证码展示通过状态(前提是前端验证也已经通过了)
               verifySuccessHook();
           } else {
               // 如果自定义验证接口验证不成功 调用verifyFailHook钩子让验证码展示失败状态
               verifyFailHook()
           }
       },
       // 自定义请求参数前置拦截函数(在中国函数中,您可以根据您的需求对请求中的明文数据进行加密等行为)
       // 注意:该配置仅在serverVerify=true和collectionDataOptios=>open=true两项配置开启时生效
       apiDataPreFn: function(apiData) {
           // apiData 是请求的参数 处理后请务必return 出该函数 否则你的处理将不会生效
           console.log('apiDataPreFn执行啦....apiData:', apiData, apiData.data);
           let myApiParams = apiData.data;
           // 我这里是对特定接口的请求参数进行扩展,您也可以进行加密等操作
           if (/\/initmlvcode/g.test(apiData.url)) {
               myApiParams.test = '这是测试数据';
           }
           // 我更改下请求数据
           apiData.data = myApiParams;
           return apiData;
       },
   },

重要的事情说三遍!!!

注意:
如果您开启了服务端验证(serverVerify=true)且用于业务场景,请自定义服务端验证接口和相关自定义配置(collectionDataOptios)!!!

3.方法与事件说明

事件或方法调用或者触发时机
successFn验证成功将触发
failFn验证失败将触发
renderSucFn但验证码开始渲染时候触发
mlVcode.switchShowVcode(‘hide’);展示或者关闭验证码值传‘hide’为关闭,‘show为显示’

三、SDK与后端验证结合的业务时序图(案例)

在这里插入图片描述

说明

本sdk模块本人原创,免费提供使用,但是源码暂时不开源~
作者gitee:https://gitee.com/xiaoz_xiansen/projects

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuckyCola2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值