欢迎来到代码驿站!

vue

当前位置:首页 > 网页前端 > vue

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

时间:2022-10-07 11:27:39|栏目: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

下一篇:vue3.0如何在全局挂载对象和方法

本文标题:Vue集成阿里云做滑块验证的实践

本文地址:http://www.codeinn.net/misctech/215708.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有