百度H5活体校验实践

作者: supa同学 | 来源:发表于2019-03-13 15:21 被阅读128次

    官方文档 Api

    第一步: 获取 access_token
    第二步: 获取语音校验码接口
    第三步: 视频活体检测接口

    这里重点说一下第三步: 百度入参video_base64 通过把视频转换成base64编码后的视频数据然后再提交给百度做校验
    通过语音校验码和人的语音校验是否是当前录制的视频, 再通过人像校验是否是活体。

    整理下相关知识点 :
    • input[capture="camcorder"]
    • FileReader
    • FormData
    • XMLHttpRequest
    • webRTC
    // 通过input唤起手机摄像机
    <input type="file"
        class="camera-input"
        @change="iptChange($event)"
        ref="cameraInput"
        accept="video/*"
        capture="camcorder" />
    

    在mobile模式下 手机是直接唤起摄像机, 并且不能通过上传本地视频的方式, 这样避免了用户作弊
    而在pc中用户可以选择文件上传, 那就只有使用webRTC来获取用户图像再传输

    iptChange (event) {
      const files = event.target.files || event.dataTransfer.files
      if (files && files.length > 0) {
        let file = files[0]
        if (file.size > 20 * 1024 * 1024) {
          // 视频大于20MB
          confirm('您录制的视频时间过大,请重新录制')
        } else {
          this.verify(file)
        }
      }
    }   
    

    通过拿到的file.size可以获取文件大小 在某个区间大小才允许用户上传

     verify (file) {
      let reader = new FileReader()
      reader.readAsDataURL(file)
    }
    

    此处用到了FileReader => readAsDataURL
    将文件读取为base64格式 data:[<mediatype>][;base64],<data> 传输给百度做校验

    FileReader 整理了个脑图
    image.png
    此处遇到一些问题

    视频转base64之后 视频体积大了2倍左右, 在传输过程中, 想通过Network查下或者调试一下, 是相当蛋疼的事情, 手机分分钟就卡死了 ! 如何优化?

    我想到的通过formdata传输二进制流给后端, 让后端再去转base64给百度

    const formdata = new FormData()
    formdata.append('videoFile', file)
    
    const xhr = new XMLHttpRequest()
    
    xhr.onload = () => {
      if (xhr.status === 200 || xhr.status === 304) {
        console.log('success')
      } else {
        console.log('服务器处理失败')
      }
    }
    
    xhr.onerror = () => {
      console.log('网络错误')
    }
    
    xhr.open('POST', 'apiUrl')
    xhr.send(formdata)
    

    本项目的开发环境用的vue-cli 用了axios 所以并没有用原生XMLHttpRequest 用 axios 直接上传
    代码如下:

    
    const formdata = new FormData()
    formdata.append('videoFile', file)
    
    this.$ajax.post('apiUrl', formdata).then(res => {})
    

    需要注意的是


    image.png

    封装过axios之后, 发现设置content-type并没有作用, 而且boundary没有如预期那样.
    最终排查原因是transformRequest通过qs.stringify转了一次请求数据, 其实content-type=multipart/form-data 是浏览器通过判断我们传输的数据自动添加上的 !

    const config = {
      transformRequest: (data) => {
        return data
      }
    }
    this.$ajax.post('/baiduVerify.json', formdata, config).then(res => {})
    

    Mobile版本的活体校验就这样解决了, PC的webRTC待我整理之后会写出来~


    项目体验地址-实名认证之后会有活体校验

    相关文章

      网友评论

        本文标题:百度H5活体校验实践

        本文链接:https://www.haomeiwen.com/subject/chgzpqtx.html