網站首頁 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會收集用戶數據。然后滑塊滑動完成后會將這些數據進行分析判斷是否為人機。當然這算法是人家的機密,畢竟要賺錢的嘛。其實這個滑動算法是可以模擬的,也不是絕對安全,只是增加了一個步驟而已。
原文鏈接:https://juejin.cn/post/7054359608520867871
相關推薦
- 2023-02-01 Bat腳本-timeout?命令(延時執行)_DOS/BAT
- 2022-05-29 C#獲取攝像頭拍照顯示圖像的方法_C#教程
- 2023-08-01 React 中 {} 的應用
- 2022-07-10 移動文件夾ubuntu
- 2022-11-13 C++實現RSA加密解密算法是示例代碼_C 語言
- 2022-04-15 Android開發Jetpack組件WorkManager用例詳解_Android
- 2022-03-10 Docker案例分析:搭建Redis服務_docker
- 2022-05-20 Tomcat下載安裝配置詳細過程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支