浅谈 前端验证码那些事

简介: 浅谈 前端验证码那些事

浅谈 前端验证码那些事

背景

在实际项目的开发中,验证码的出现的频率相当高,它能实现人机甄别访问、减轻服务器负担的作用。常见的验证码为以下几类:

  1. 图形验证码:通过展示一个随机生成的图形,要求用户输入对应的文字或数字来判断用户是否为真实用户
  2. 滑块验证码:用户需要在一个包含滑块的图形上,通过滑动滑块到指定位置或者旋转某个图形直到合适的位置来完成验证
  3. 短信验证码:用户在注册或登录过程中输入手机号码,并请求发送验证码到手机,然后用户通过查看手机短信来获取验证码。
  4. 语音验证码:通过语音形式发送验证码到用户的手机或其他设备上,用户听取语音中的验证码后进行输入。主要用在视觉障碍用户或者在不方便查看图形验证码的用户
  5. 多种验证码相结合: 有些场景下,会将多种验证码相结合。如先通过图形验证码的测试,再进行短信验证码

其中短信验证码或者语音验证码一般都是直接购买第三方的服务来实现。

最后,采取哪种方式的验证码都是基于安全+体验+成功的综合考虑,合适的就是最好的。

图形验证码示例

随机文字

A474B0_R$S~8FGK24KOLJNS.png

点击图形文字

R14Z_UYB]}ZP85NKFF47J73.png

数学运算

6GLYHU{FHXH6T95Q1$8[T7E.png

滑块验证码示例

普通滑块

%UW{C1]9HY3RN08}W_4BZE1.png

旋转图形

HQK~53NMLPHDX0M]3H$G[59.png

短信验证码示例

1}NS_}_]`G0S)$E_AC6[N2V.png

语音验证码示例

你输入号码后,就会有一个PLJJ给你打电话了。。。。

WXXAMKQYT(X}}YB04T`Q80M.png

多种验证码结合

IMSN82D}Z0OAU105G51KYC7.png

图形验证码实现流程

今天我们先来讲下相对简单的普通图形验证码

0HRXVIXAB]I92Y)`UV$P5KF.png

我们以登录为背景

GO2Y~T3V9K7{K%%Z_OD)SCQ.png


泳道图

DQPQYGAM77OEDZE`[(PX7LW.png


  1. 前端:用户打开登录页面,发送请求,获取验证码
  2. 后端:接收请求,生成验证码(图片和具体文本),为了区分是当前用户的请求,一般会同时生成唯一id
  1. 将验证码文本和唯一id存到服务端,如 redis,顺带存下时间,用来做验证码过期判断使用的
  2. 将验证码图片和唯一id响应给前端
  1. 前端:接收验证码图片和唯一id,展示验证码图片
  2. 前端:将用户名、密码、用户输入的验证码和唯一id一并提交给后端
  3. 后端:接收数据,开始校验,并且返回校验结果

相关代码

前端使用的是uniapp , 后端是配套的uniapp云开发环境。 如果想要一起交流uniapp相关知识,欢迎联系

前端登录页面

<template>
  <div class="login-container">
    <el-form ref="loginForm" class="login-form" autocomplete="on" label-position="left">
      <div class="title-container">
        <h3 class="title">平台</h3>
      </div>
      <el-form-item prop="username">
        <el-input class="login-input" ref="username" placeholder="用户名" name="username" type="text" tabindex="1"
          autocomplete="on" />
      </el-form-item>
      <el-form-item prop="password">
        <el-input class="login-input" ref="password" placeholder="密码" name="password" tabindex="2"
          autocomplete="on" />
      </el-form-item>
      <el-form-item>
        <el-row :gutter="10" style="width:100%">
          <el-col :span="14">
            <el-input v-model="captcha" style="height: 100%;" placeholder="请输入验证码" />
          </el-col>
          <el-col :span="10">
            <div @click="getCaptcha" style="background-color: aliceblue;" v-html="captchaCode"></div>
          </el-col>
        </el-row>
      </el-form-item>
      <el-button type="primary" style="width:100%;height:50px;margin-bottom:30px;"
        @click="valifyCaptcha">登录</el-button>
    </el-form>
  </div>
</template>
<script setup>
  import {
    ref
  } from "vue"
  import {
    onLoad
  } from "@dcloudio/uni-app"
  const captchaCloud = uniCloud.importObject("captcha") // uniapp 的 云对象 
  const captchaCode = ref("") // 展示验证码图片
  const captcha = ref("") // 记录用户输入的验证码
  let uuid = "" // 唯一id
  // 获取验证码的
  const getCaptcha = async () => {
    const res = await captchaCloud.getCaptcha()
    // console.log(res)
    captchaCode.value = res.svg
    uuid = res.uuid
  }
  // 单独校验验证码是否正确的 接口  用来测试使用  tips:本次没有校验用户名和密码
  const valifyCaptcha = async () => {
    const res = await captchaCloud.valifyCaptcha(captcha.value, uuid)
    console.log(res)
  }
  onLoad(() => {
    getCaptcha()
  })
</script>
<style lang="scss">
  $bg: #2d3a4b;
  $dark_gray: #889aa4;
  $light_gray: #eee;
  .login-container {
    width: 100%;
    background-color: $bg;
    overflow: hidden;
    height: 100vh;
    .login-form {
      position: relative;
      width: 520px;
      max-width: 100%;
      padding: 160px 35px 0;
      margin: 0 auto;
      overflow: hidden;
      :deep(.el-input__wrapper) {
        width: 100%;
        height: 100%;
        box-sizing: border-box;
      }
    }
    .title-container {
      position: relative;
      .title {
        font-size: 26px;
        color: $light_gray;
        margin: 0px auto 40px auto;
        text-align: center;
        font-weight: bold;
      }
    }
  }
  $bg: #283443;
  $light_gray: #fff;
  $cursor: #fff;
  /* reset element-ui css */
  .login-container {
    .el-input {
      display: inline-block;
      height: 47px;
    }
    .el-form-item {
      border: 1px solid rgba(255, 255, 255, 0.1);
      background: rgba(0, 0, 0, 0.1);
      border-radius: 5px;
      color: #454545;
    }
  }
</style>

后端代码

使用的是 uniapp云开发中的云对象, 示例代码 没有引入 redis ,直接存在数据库中。 生成验证码插件用的是 svg-captcha

'use strict';
const svgCaptcha = require('svg-captcha'); // 生成验证码的插件
const db = uniCloud.database()
module.exports = {
  _before: function() { // 通用预处理器
  },
    // 生成验证码
  async getCaptcha() {
    const captcha = svgCaptcha.create();
        // 成功插入数据库后,res会获得当前数据的id,将这个id 看成唯一id即可。 也可以使用第三方库  nanoid 独立生成
    const res = await db.collection("captcha").add({
      text: captcha.text,
      create_date: Date.now(),
    })
    // console.log(res)
    //返回数据给客户端
    return {
      svg: captcha.data,
      uuid: res.id
    }
  },
    
    // 校验验证码 
  async valifyCaptcha(text, uuid) {
    const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云对象的clientInfo
      clientInfo: this.getClientInfo()
    })
    // 校验 唯一id和验证码和是否过期
    const res = await dbJQL.collection("captcha").where(
      `text=='${text}' && ${Date.now()} - create_date > ${1000*60}  && _id=='${uuid}'`).count()
    // console.dir(res) 
    return !!res.total
  }
}

目录
相关文章
|
5月前
|
前端开发 数据可视化 JavaScript
前端图形学实战: 从零开发一款轻量级滑动验证码组件(vue3 + vite版)
前端图形学实战: 从零开发一款轻量级滑动验证码组件(vue3 + vite版)
446 0
|
11天前
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
11 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
25天前
|
存储 JSON 前端开发
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
本文介绍了在Node.js中使用token实现前端验证码和登录功能的详细流程,包括生成验证码、账号密码验证以及token验证和过期处理。
30 0
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
|
3月前
|
JavaScript 前端开发 API
koa2使用svg-captcha生成验证码接口(含前端vue项目中使用)
koa2使用svg-captcha生成验证码接口(含前端vue项目中使用)
99 0
|
4月前
|
前端开发 JavaScript
阿里云验证码2.0 验证时报错 前端页面获取的验证参数有问题,动态JS加载失败,请问怎么解决啊?急,急,急。
用户反馈校验时遇到错误,日志显示验证码参数获取异常。采用无痕验证,失败后,返回`{captchaResult:false,bizResult:false}`,未触发滑块二次验证。
|
5月前
|
NoSQL JavaScript 前端开发
报错场景:ant design vue前端登录时,输入的验证码是对的,但是一直提上验证码错误,登录不进去 报错信息(Error in execution; nested exception)
报错场景:ant design vue前端登录时,输入的验证码是对的,但是一直提上验证码错误,登录不进去 报错信息(Error in execution; nested exception)
51 0
|
5月前
|
JavaScript 前端开发 NoSQL
大数据发送验证码前后端编写 前端使用Vue
大数据发送验证码前后端编写 前端使用Vue
|
移动开发 前端开发 JavaScript
Vue 利用Canvas标签实现动态验证码校验(前端必备附源码)
Vue 利用Canvas标签实现动态验证码校验(前端必备附源码)
433 0
|
前端开发
前端react验证码6位随机码(大小写字母+数字)
前端react验证码6位随机码(大小写字母+数字)
266 0
|
JavaScript 前端开发
vue前端生成验证码及操作
vue前端生成验证码及操作
282 0