前言
滑块验证是比较常见的人机鉴别手段,但是自己做一时半会还真搞不出来,想想这玩意还挺难琢磨,怎么识别是否是人机呢?本文介绍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!