Vue集成阿里云做滑块验证的实践

2022-10-14

滑块验证是比较常见的人机鉴别的方法,本文主要介绍了Vue集成阿里云做滑块验证,具有一定的参考价值,感兴趣的可以了解一下

目录
  • 前言
  • 集成阿里云验证
    • 前端需要什么
    • 引入阿里云验证
    • 封装一个验证组件
    • 使用组件
  • 思考

    前言

    滑块验证是比较常见的人机鉴别手段,但是自己做一时半会还真搞不出来,想想这玩意还挺难琢磨,怎么识别是否是人机呢?本文介绍Vue+阿里云验证做出这个小功能。

    集成阿里云验证

    前端需要什么

    • appkey
    • scene
    • 后端配合

    引入阿里云验证

    public/index.html

    <head>
      <script src="https://g.alicdn.com/AWSC/AWSC/awsc.js"></script>
    </head>

    vue.config.js

    module.exports = {
      configureWebpack: {
        externals: {
          AWSC: 'AWSC',
        },
      }
    }

    封装一个验证组件

    思路其实很简单,功能也单一。

    • 初始化加载阿里云验证控件
    • 可刷新验证控件

    下面说两个重点

    1. 初始化放在mounted,是因为涉及到Dom加载问题,created时Dom并未加载完成会报错。
    2. Watch里面监听是否刷新
    3.. 记得样式自定义下

    下面开始写组件
    NoCaptcha.vue

    <template>
      <div>
        <div id="nc">
    
        </div>
      </div>
    </template>
    
    <script>
    export default {
      // 验证成功后,服务端报错(如账号/密码等错误),需要重置滑块
      props: {
        reload: {
          type: Boolean,
          default: false,
        },
      },
      data() {
        return {
          ic: '', // noCaptcha实例
        };
      },
      watch: {
        reload: {
          handler(newV) {
            console.log(newV);
            if (newV) {
              this.nc.reset();  // 重置滑块
            }
          },
        },
      },
      mounted() {
        this.init(); // 初始化方法
      },
      methods: {
        init() {
          const self = this;
          // 实例化nc
          // eslint-disable-next-line no-undef
          AWSC.use('nc', function(state, module) {
            // 初始化
            self.nc = module.init({
              // 您可以在阿里云验证码控制台的配置管理页签找到对应的appkey字段值,请务必正确填写。
              appkey: 'FFFF0N00000000005CE9',
              // 您可以在阿里云验证码控制台的配置管理页签找到对应的scene值,请务必正确填写。
              scene: 'nc_login',
              // 滑块渲染的DOM id。
              renderTo: 'nc',
              // 您可以在该回调参数中将会话ID(sessionId)、签名串(sig)、请求唯一标识(token)字段记录下来,随业务请求一同发送至您的服务端调用验签。
              success: function(data) {
                data.scene = 'nc_login'
                self.$emit('slideCallback', data);
              },
              // 滑动验证失败时触发该回调参数。
              fail: function(failCode) {
                this.$message(`滑动验证失败,失败编号${failCode}`);
                console.log(failCode);
              },
              // 验证码加载出现异常时触发该回调参数。
              error: function(errorCode) {
                this.$message(`验证码加载异常,异常编号${errorCode}`);
                console.log(errorCode);
                self.$emit('slideCallback', {cls:false});
              },
            });
          });
        },
      },
    };
    </script>
    
    <style lang="scss" scoped>
    #nc {
      width: 100%;
      display: contents;
    }
    /deep/.nc-container #nc_1_wrapper {
      width: 100%;
      height: 36px;
      line-height: 36px;
      #nc_1_n1t,
      #nc_1__bg,
      #nc_1_n1z,
      #nc_1__scale_text,
      .nc-lang-cnt {
        height: 36px;
        line-height: 36px;
      }
    }
    </style>

    使用组件

    需要考虑的问题

    • 验证控件没加载出来的情况怎么办?(例如IE不支持)
    • 运维人员不需要
    • 有用户名密码,再去验证自动调用登录事件

    很简单验证控件加载失败会有个回调,让后端加个参数,没加载验证组件,让他知道予以通行就好

    <template>
      // 其他代码略
      <NoCaptcha @slideCallback="finishSlide" :reload="reload" />
    </template>
    
    <script>
    // 其他代码略
    import NoCaptcha from '@/components/NoCaptch.vue';
    
    data() {
      return {
        reload: false,
      }
    },
    method: {
      // 点击登录
      login() {
        // 验证略
        this.reload = false; // 验证通过后,重置滑块设置为false
        // 后端登录接口
        xx()
        .then(() => {
           // 登录成功代码略
        })
        .catch((err) => {
           // 其他代码略
           this.reload = true; // 需要重置滑块
           console.log(err || '该用户无菜单权限,请联系管理员'); // 错误提示
        });
      },
      // 完成滑动
      finishSlide(data) {
        // 按需使用返回值
        console.log('会话ID', data.sessionId)
        console.log('签名串', data.sig)
        console.log('滑块请求的token', data.token)
        
         if (data.cls === false) {//验证加载失败
            this.loginForm.cls = false
          }
    
          if (data.sessionId) {//非人机操作
            this.loginForm.scene = data.scene
            this.loginForm.ncToken = data.token
            this.loginForm.sig = data.sig
            this.loginForm.sessionId = data.sessionId
            delete this.loginForm.cls
          }
    
          if (this.loginForm.username && this.loginForm.password) {//填过用户名密码
            this.login()
          }
      },
    }
    </script>

    思考

    • 如果这个控件让前端自己做或者后端自己做,能实现吗?
    • 这个滑动验证机制明白吗?
    • 这个能实现绝对安全吗?

    PS:我思考了一下,前端需要引入阿里云的sdk,这个sdk会收集用户数据。然后滑块滑动完成后会将这些数据进行分析判断是否为人机。当然这算法是人家的机密,毕竟要赚钱的嘛。其实这个滑动算法是可以模拟的,也不是绝对安全,只是增加了一个步骤而已。

    到此这篇关于Vue集成阿里云做滑块验证的实践的文章就介绍到这了,更多相关Vue 滑块验证内容请搜索北冥有鱼以前的文章或继续浏览下面的相关文章希望大家以后多多支持北冥有鱼!

    您可能感兴趣的文章:

    • vue+elementui实现拖住滑块拼图验证
    • vue实现移动滑块验证
    • vue实现登录时滑块验证
    • Vue3+Vue-cli4项目中使用腾讯滑块验证码的方法
    • vue实现简单滑块验证
    • 使用konva和vue-konva库实现拖拽滑块验证功能
    • VUE接入腾讯验证码功能(滑块验证)备忘
    • Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
    • vue-cli 自定义指令directive 添加验证滑块示例
    • vue封装图片滑块验证组件的方法

    《Vue集成阿里云做滑块验证的实践.doc》

    下载本文的Word格式文档,以方便收藏与打印。