网易易盾云图片(行为)验证码,网易验证码,前端vue后端python drf。前后分离

网易易盾开通

官网相关链接:
网易易盾
在线体验:在线体验验证码

在线体验
联系客服开通体验账户后,点击进入管理中心
在这里插入图片描述

添加产品,添加时:测试先随意起个名字,选择web。
准备开工
在这里插入图片描述

前端 Vue

官方接入文档在这里:
前端接入文档

先在vue项目的public下的index.html中引入script。官方文档中还有宕机模式的,可以看官方文档

    <script src="http://cstaticdun.126.net/load.min.js"></script>

引入简单脚本

先把template的代码贴出来

  • 这里并没有按官文接入文档的来,选择在button的地方,使用了@click事件。方便点击跳出验证,通过再进行后续操作
<template>
    <div class="a">
        <h2>登录组件</h2>

        <div class="form-container aa">
            <p>
                <input type="text" name="username" id="username" placeholder="用户名">
            </p>
            <p>
                <input type="password" name="password" id="password" placeholder="密码">
            </p>
            <div class="c" id="captcha"></div> <!-- 验证码容器元素 -->
            <button style="width: 30px;height: 20px" @click="handleLogin">登录</button>
        </div>
    </div>

</template>

vue的template
接下来会用到captchaId,它在刚刚创建的业务中你需要的captchaid

现在把script的代码贴出来

  • 注释看截图,代码上就不贴注释了
<script>
	import axios from "axios";
	export default {
		methods: {
			handleLogin() {
				var date = new Date().getTime();
				console.log(date)
				initNECaptcha({
					captchaId: '你的captchaId',
					element: '#captcha',
					width: '260px 400px',
					onVerify: function (err, data) {
						if (data) {
							axios.post('http://127.0.0.1:8000/api/', {
								date:date,
								captchaId: '你的captchaId',
								validate: data.validate,
							}).then((res) => {
								if (res.data.dic.static === 1){
									console.log('通过了验证')
                                } else {
									console.log('没有通过校验')
                                }
							}).catch((errors) => {
								console.log('发送数据错误')
							})
						} else {
							console.log("没有验证通过")
						}
					}
				}, function onload(instance) {

				}, function onerror(error) {
					// 初始化失败后触发该函数,err对象描述当前错误信息
					console.log(error)
				})
			}
		}
	}
</script>

第一部分截图
第二部分截图
第三部分截图

后端 python django drf

官方相关文档:(主要看以下三个,三个接口都需要)

接下来需要先申请安全凭证:获取到一会校验时需要的SecretId 和 SecretKey
获取安全凭证
开始后端的干活,为了效率,全写在了views里了。。。为了方便
这些是需要导入的包

import json

from rest_framework.views import APIView
from rest_framework.response import Response
from urllib.parse import urlencode
from urllib.request import urlopen

import hashlib, uuid

一共三个方法
三个函数

第一个接收post请求,因为不涉及数据库,所以只继承了APIView。调用verification_code方法,方法返回dic,dic的结果是二次校验是否成功,成为static为1,不成功static为0

class RegisterView(APIView):
    def post(self, request, *args, **kwargs):
        dic = verification_code(request)
        return Response({"data": request.data, 'dic': dic})

接下来是verification_code

def verification_code(request):
    # 要求传的防重放,你也可以别的方式生成
    nonce = uuid.uuid4().hex + uuid.uuid1().hex
    # params的数据要按ASCII码表排序,具体排序规则看签名生成文档,上方有链接
    # user要有,可以为空
    params = {
        "captchaId": request.data['captchaId'],
        "nonce": nonce,
        "secretId": '你的安全凭证secretId',
        "timestamp": request.data['date'],
        "user": '',
        "validate": request.data["validate"],
        'version': 'v2',
    }
    # 生成签名,gen_signature在下面贴出来,这个在官方文档中也有
    # secretKey在安全凭证中
    has = gen_signature('你的secretKey', params)
    # 把签名加到数据中一起传给网易易盾
    params['signature'] = has
    url = "https://c.dun.163.com/api/v2/verify"
    params = urlencode(params).encode()
    f = urlopen(url, params)
    content = f.read()
    res = json.loads(content)
	#res拿到易盾返回的数据,以下是响应体示例
    # 响应体示例
    # {
    #     "result": true,
    #     "error": 0,
    #     "msg": "ok",
    #     "phone": "",
    #     "extraData": "",
    #     "captchaType": 2,
    #     "token": "xxx",
    #     "sdkReduce": false
    # }
    dic = {
        'static': 0
    }
    print(res)
    if res:
    	# result为True说明二次校验通过,给前端返回static为1
        if res['result']:
            dic['static'] = 1
            return dic
        else:
        	# 如果有问题,打印错误,错误码查看官方文档
            print("%s:%s" % (res.get('error'), res.get('msg')))
            return dic
    else:
        print("响应数据有问题")
        return dic
```

接下来是官方的签名算法:
- 和官方文档上是完全一样的,直接用就行
```python
# 生成签名信息
# Args:
#    secret_key 产品私钥
#    param_dict 接口请求参数,不包括signature参数


def gen_signature(secret_key, param_dict):
    param_str = ''.join([
        str(name) + str(param_dict[name] or '')
        for name
        in sorted(param_dict.keys())
    ])
    param_str += secret_key

    return hashlib.md5(param_str.encode("utf-8")).hexdigest()
```

搞定收工。。。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值