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

集成阿里云验证
前端需要什么
引入阿里云验证
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 滑块验证内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!