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

 更新时间:2022年01月19日 14:54:44   作者:凉城a  
滑块验证是比较常见的人机鉴别的方法,本文主要介绍了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+java实现时间段的搜索示例

    Vue+java实现时间段的搜索示例

    本文主要介绍了Vue+java实现时间段的搜索示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 在vue2中实现截图功能的基本步骤

    在vue2中实现截图功能的基本步骤

    在Vue 2中实现截图功能,可以使用HTML5的Canvas元素和一些JavaScript代码来捕获屏幕或特定元素的截图,以下是一个简单的步骤和示例代码来实现这个功能,需要的朋友可以参考下
    2023-10-10
  • Vue中的Strorage本地化存储详解

    Vue中的Strorage本地化存储详解

    这篇文章主要介绍了Vue中的Strorage本地化存储详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue项目中 jsconfig.json概念及使用步骤

    vue项目中 jsconfig.json概念及使用步骤

    这篇文章主要介绍了vue项目中 jsconfig.json是什么,本文仅仅简单介绍了 jsconfig .json 的一些基本配置,而 jsconfig .json提供了大量能使我们快速便捷提高代码效率的方法,需要的朋友可以参考下
    2022-07-07
  • vue extend+promise封装全局弹窗组件

    vue extend+promise封装全局弹窗组件

    这篇文章主要为大家详细介绍了vue extend+promise封装全局弹窗组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Vue中使用计算属性的知识点总结

    Vue中使用计算属性的知识点总结

    在本篇文章里小编给大家整理了一篇关于Vue中使用计算属性的知识点总结内容,对此有兴趣的朋友们可以跟着学习参考下。
    2021-12-12
  • vue基础之详解ElementUI的表单

    vue基础之详解ElementUI的表单

    这篇文章主要为大家详细介绍了vue基础之ElementUI的表单,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • vue3使用mitt.js实现各种组件间的通信

    vue3使用mitt.js实现各种组件间的通信

    在vue工程中,除开vue自带的什么父子间,祖孙间通信,还有一个非常方便的通信方式,类似Vue2.x 使用 EventBus 进行组件通信,而 Vue3.x 推荐使用 mitt.js,可以实现各个组件间的通信,所以本文给大家介绍了vue3使用mitt.js实现组件通信,需要的朋友可以参考下
    2024-05-05
  • Element-UI 多个el-upload组件自定义上传不用上传url并且携带自定义传参(文件序号)

    Element-UI 多个el-upload组件自定义上传不用上传url并且携带自定义传参(文件序号)

    有多个upload组件,每个都需要单独上传获取文件(JS File类型),不需要action上传到指定url,自定义上传动作和http操作,下面通过本文给大家分享Element-UI 多个el-upload组件自定义上传不用上传url并且携带自定义传参(文件序号),感兴趣的朋友一起看看吧
    2024-06-06
  • vuejs中监听窗口关闭和窗口刷新事件的方法

    vuejs中监听窗口关闭和窗口刷新事件的方法

    今天小编就为大家分享一篇vuejs中监听窗口关闭和窗口刷新事件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09

最新评论