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

82 阅读3分钟

前言

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

介绍

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

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

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


一、效果展示

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

二、使用步骤

1.引入库

  1. 引入luckycola.com.cn/public/sour… 文件
  2. 在需要的地方初始化
  3. 参考在线demo: http://101.43.139.11:90/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: 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()
                            }
                        },
                    },
                    successFn: (rsp) => {
                        console.log('自定义成功回调函数执行...', mlVcode);
                        // mlVcode.switchShowVcode('hide');
                    },
                    failFn: (rsp) => {
                        console.log('自定义失败回调函数执行...');
                    },
                    renderSucFn(rsp) {
                        console.log('自定义失render调函数执行...');
                    },
            }).render();
        };
    </script>
</body>
</html>

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

2.参数说明

参数是否必须说明
colaKeystring唯一的验证key,请前往官网(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)!!!!!

3.方法与事件说明

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

说明

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