经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
Vue集成阿里云做滑块验证的实践
来源:jb51  时间:2022/1/19 15:45:48  对本文有异议

前言

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

集成阿里云验证

前端需要什么

  • appkey
  • scene
  • 后端配合

引入阿里云验证

public/index.html

  1. <head>
  2. ? <script src="https://g.alicdn.com/AWSC/AWSC/awsc.js"></script>
  3. </head>

vue.config.js

  1. module.exports = {
  2. ? configureWebpack: {
  3. ? ? externals: {
  4. ? ? ? AWSC: 'AWSC',
  5. ? ? },
  6. ? }
  7. }

封装一个验证组件

思路其实很简单,功能也单一。

  • 初始化加载阿里云验证控件
  • 可刷新验证控件

下面说两个重点

1. 初始化放在mounted,是因为涉及到Dom加载问题,created时Dom并未加载完成会报错。
2. Watch里面监听是否刷新
3.. 记得样式自定义下

下面开始写组件
NoCaptcha.vue

  1. <template>
  2. ? <div>
  3. ? ? <div id="nc">
  4.  
  5. ? ? </div>
  6. ? </div>
  7. </template>
  8.  
  9. <script>
  10. export default {
  11. ? // 验证成功后,服务端报错(如账号/密码等错误),需要重置滑块
  12. ? props: {
  13. ? ? reload: {
  14. ? ? ? type: Boolean,
  15. ? ? ? default: false,
  16. ? ? },
  17. ? },
  18. ? data() {
  19. ? ? return {
  20. ? ? ? ic: '', // noCaptcha实例
  21. ? ? };
  22. ? },
  23. ? watch: {
  24. ? ? reload: {
  25. ? ? ? handler(newV) {
  26. ? ? ? ? console.log(newV);
  27. ? ? ? ? if (newV) {
  28. ? ? ? ? ? this.nc.reset(); ?// 重置滑块
  29. ? ? ? ? }
  30. ? ? ? },
  31. ? ? },
  32. ? },
  33. ? mounted() {
  34. ? ? this.init(); // 初始化方法
  35. ? },
  36. ? methods: {
  37. ? ? init() {
  38. ? ? ? const self = this;
  39. ? ? ? // 实例化nc
  40. ? ? ? // eslint-disable-next-line no-undef
  41. ? ? ? AWSC.use('nc', function(state, module) {
  42. ? ? ? ? // 初始化
  43. ? ? ? ? self.nc = module.init({
  44. ? ? ? ? ? // 您可以在阿里云验证码控制台的配置管理页签找到对应的appkey字段值,请务必正确填写。
  45. ? ? ? ? ? appkey: 'FFFF0N00000000005CE9',
  46. ? ? ? ? ? // 您可以在阿里云验证码控制台的配置管理页签找到对应的scene值,请务必正确填写。
  47. ? ? ? ? ? scene: 'nc_login',
  48. ? ? ? ? ? // 滑块渲染的DOM id。
  49. ? ? ? ? ? renderTo: 'nc',
  50. ? ? ? ? ? // 您可以在该回调参数中将会话ID(sessionId)、签名串(sig)、请求唯一标识(token)字段记录下来,随业务请求一同发送至您的服务端调用验签。
  51. ? ? ? ? ? success: function(data) {
  52. ? ? ? ? ? ? data.scene = 'nc_login'
  53. ? ? ? ? ? ? self.$emit('slideCallback', data);
  54. ? ? ? ? ? },
  55. ? ? ? ? ? // 滑动验证失败时触发该回调参数。
  56. ? ? ? ? ? fail: function(failCode) {
  57. ? ? ? ? ? ? this.$message(`滑动验证失败,失败编号${failCode}`);
  58. ? ? ? ? ? ? console.log(failCode);
  59. ? ? ? ? ? },
  60. ? ? ? ? ? // 验证码加载出现异常时触发该回调参数。
  61. ? ? ? ? ? error: function(errorCode) {
  62. ? ? ? ? ? ? this.$message(`验证码加载异常,异常编号${errorCode}`);
  63. ? ? ? ? ? ? console.log(errorCode);
  64. ? ? ? ? ? ? self.$emit('slideCallback', {cls:false});
  65. ? ? ? ? ? },
  66. ? ? ? ? });
  67. ? ? ? });
  68. ? ? },
  69. ? },
  70. };
  71. </script>
  72.  
  73. <style lang="scss" scoped>
  74. #nc {
  75. ? width: 100%;
  76. ? display: contents;
  77. }
  78. /deep/.nc-container #nc_1_wrapper {
  79. ? width: 100%;
  80. ? height: 36px;
  81. ? line-height: 36px;
  82. ? #nc_1_n1t,
  83. ? #nc_1__bg,
  84. ? #nc_1_n1z,
  85. ? #nc_1__scale_text,
  86. ? .nc-lang-cnt {
  87. ? ? height: 36px;
  88. ? ? line-height: 36px;
  89. ? }
  90. }
  91. </style>

使用组件

需要考虑的问题

  • 验证控件没加载出来的情况怎么办?(例如IE不支持)
  • 运维人员不需要
  • 有用户名密码,再去验证自动调用登录事件

很简单验证控件加载失败会有个回调,让后端加个参数,没加载验证组件,让他知道予以通行就好

  1. <template>
  2. ? // 其他代码略
  3. ? <NoCaptcha @slideCallback="finishSlide" :reload="reload" />
  4. </template>
  5.  
  6. <script>
  7. // 其他代码略
  8. import NoCaptcha from '@/components/NoCaptch.vue';
  9.  
  10. data() {
  11. ? return {
  12. ? ? reload: false,
  13. ? }
  14. },
  15. method: {
  16. ? // 点击登录
  17. ? login() {
  18. ? ? // 验证略
  19. ? ? this.reload = false; // 验证通过后,重置滑块设置为false
  20. ? ? // 后端登录接口
  21. ? ? xx()
  22. ? ? .then(() => {
  23. ? ? ? ?// 登录成功代码略
  24. ? ? })
  25. ? ? .catch((err) => {
  26. ? ? ? ?// 其他代码略
  27. ? ? ? ?this.reload = true; // 需要重置滑块
  28. ? ? ? ?console.log(err || '该用户无菜单权限,请联系管理员'); // 错误提示
  29. ? ? });
  30. ? },
  31. ? // 完成滑动
  32. ? finishSlide(data) {
  33. ? ? // 按需使用返回值
  34. ? ? console.log('会话ID', data.sessionId)
  35. ? ? console.log('签名串', data.sig)
  36. ? ? console.log('滑块请求的token', data.token)
  37. ? ??
  38. ? ? ?if (data.cls === false) {//验证加载失败
  39. ? ? ? ? this.loginForm.cls = false
  40. ? ? ? }
  41.  
  42. ? ? ? if (data.sessionId) {//非人机操作
  43. ? ? ? ? this.loginForm.scene = data.scene
  44. ? ? ? ? this.loginForm.ncToken = data.token
  45. ? ? ? ? this.loginForm.sig = data.sig
  46. ? ? ? ? this.loginForm.sessionId = data.sessionId
  47. ? ? ? ? delete this.loginForm.cls
  48. ? ? ? }
  49.  
  50. ? ? ? if (this.loginForm.username && this.loginForm.password) {//填过用户名密码
  51. ? ? ? ? this.login()
  52. ? ? ? }
  53. ? },
  54. }
  55. </script>

思考

  • 如果这个控件让前端自己做或者后端自己做,能实现吗?
  • 这个滑动验证机制明白吗?
  • 这个能实现绝对安全吗?

PS:我思考了一下,前端需要引入阿里云的sdk,这个sdk会收集用户数据。然后滑块滑动完成后会将这些数据进行分析判断是否为人机。当然这算法是人家的机密,毕竟要赚钱的嘛。其实这个滑动算法是可以模拟的,也不是绝对安全,只是增加了一个步骤而已。

到此这篇关于Vue集成阿里云做滑块验证的实践的文章就介绍到这了,更多相关Vue 滑块验证内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号