Vue 滑块验证
凉城a 人气:1前言
滑块验证是比较常见的人机鉴别手段,但是自己做一时半会还真搞不出来,想想这玩意还挺难琢磨,怎么识别是否是人机呢?本文介绍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会收集用户数据。然后滑块滑动完成后会将这些数据进行分析判断是否为人机。当然这算法是人家的机密,毕竟要赚钱的嘛。其实这个滑动算法是可以模拟的,也不是绝对安全,只是增加了一个步骤而已。
加载全部内容