极验滑动验证登录

极验滑动验证登录

滑动验证码

验证码是网站用来防止网络入侵的一种手段,现在相对安全而且比较流行的就是滑动验证码,
实现效果如下:

 

geetest

 

极验验证码

官网:http://www.geetest.com/

Python 实现的滑动验证码网址:https://docs.geetest.com/install/deploy/server/python

注意: 使用第三方插件时不要求看懂,只要求能按照提供的 demo 和技术文档完成其功能。

安装极验自己的包

在项目中需要使用极验自己的包

from geetest import GeetestLib

可以使用 Pycharm 安装此包或者直接用 pip 安装

pip install geetest

HTML 页面代码

需要引入极验提供的 JS 文件

<!-- 引入封装了failback的接口--initGeetest -->
<script src="http://static.geetest.com/static/tools/gt.js"></script>

使用 AJAX 异步向后台发送数据,所以引入 JQuery 文件

<script src="/static/jquery-3.3.1.js"></script>

HTML 代码部分与普通 Form 表单页面所不同的就是多了个放置验证码的 form-group 组:

<div class="form-group">
    <!-- 放置极验的滑动验证码 -->
    <div id="popup-captcha"></div>
</div>

前端向后端获取验证码信息

通过 AJAX 异步从后端获取验证码信息,代码直接拷过来就行,需要注意的是代码中获取验证码的路由,在 urls 和 views 中添加响应代码。

// 验证开始需要向网站主后台获取id,challenge,success(是否启用failback)
    $.ajax({
        url: "/pc-geetest/register?t=" + (new Date()).getTime(), // 加随机数防止缓存
        type: "get",
        dataType: "json",
        success: function (data) {
            // 使用initGeetest接口
            // 参数1:配置参数
            // 参数2:回调,回调的第一个参数验证码对象,之后可以使用它做appendTo之类的事件
            initGeetest({
                gt: data.gt,
                challenge: data.challenge,
                product: "popup", // 产品形式,包括:float,embed,popup。注意只对PC版验证码有效
                offline: !data.success // 表示用户后台检测极验服务器是否宕机,一般不需要关注
                // 更多配置参数请参见:http://www.geetest.com/install/sections/idx-client-sdk.html#config
            }, handlerPopup);
        }
    });

urls 中添加响应的路由:

url(r'^pc-geetest/register', views.pcgetcaptcha),

views 中响应的视图函数: 直接拷贝

# 请在官网申请ID使用,示例ID不可使用
pc_geetest_id = "b46d1900d0a894591916ea94ea91bd2c"
pc_geetest_key = "36fc3fe98530eea08dfc6ce76e3d24c4"


# 极验获取验证码
def pcgetcaptcha(request):
    user_id = 'test'
    gt = GeetestLib(pc_geetest_id, pc_geetest_key)
    status = gt.pre_process(user_id)
    request.session[gt.GT_STATUS_SESSION_KEY] = status
    request.session["user_id"] = user_id
    response_str = gt.get_response_str()
    return HttpResponse(response_str)

前端向后盾发送验证码及数据信息

直接拷贝后需要改动的地方有:

  1. 进行二次验证的 url
    url:"/login/"
  2. 往后端发送的数据
    username: $("#username").val(),
    password: $("#password").val(),
    csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
    
  3. 成功返回数据后的操作
    success: function (data) {
        if (data.status) {
            // 有错误,在页面上提示
            $(".login-error").text(data.msg);
        } else {
            // 登陆成功
            location.href = data.msg;
        }
    }
    
  4. 绑定 AJAX 触发元素
    $("#login-button").click(function () {
            captchaObj.show();
        });
    
  5. 绑定显示滑动验证码的元素
    // 将验证码加到id为captcha的元素里
    captchaObj.appendTo("#popup-captcha");
    
var handlerPopup = function (captchaObj) {
    // 成功的回调
    captchaObj.onSuccess(function () {
        var validate = captchaObj.getValidate();
        $.ajax({
            // url: "/pc-geetest/ajax_validate",
            url: "/login/", // 进行二次验证
            type: "post",
            dataType: "json",
            data: {
                username: $("#username").val(),
                password: $("#password").val(),
                csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
                // 极验需要传到后端的数据
                geetest_challenge: validate.geetest_challenge,
                geetest_validate: validate.geetest_validate,
                geetest_seccode: validate.geetest_seccode
            },
            success: function (data) {
                if (data.status) {
                // 有错误,在页面上提示
                $(".login-error").text(data.msg);
            } else {
                // 登陆成功
                location.href = data.msg;
            }
            }
        });
    });
    $("#login-button").click(function () {
        captchaObj.show();
    });
    // 将验证码加到id为captcha的元素里
    captchaObj.appendTo("#popup-captcha");
    // 更多接口参考:http://www.geetest.com/install/sections/idx-client-sdk.html
};

视图函数处理

需要改动的地方就是验证码正确与不正确时返回的数据

def login(request):
    if request.method == "POST":
        # 初始化一个给AJAX返回的数据
        ret = {"status": 0, "msg": ""}

        # 从提交过来的数据中 取到用户名和密码
        username = request.POST.get("username")
        password = request.POST.get("password")

        # 极验获取的验证码并验证
        gt = GeetestLib(pc_geetest_id, pc_geetest_key)
        challenge = request.POST.get(gt.FN_CHALLENGE, '')
        validate = request.POST.get(gt.FN_VALIDATE, '')
        seccode = request.POST.get(gt.FN_SECCODE, '')
        status = request.session[gt.GT_STATUS_SESSION_KEY]
        user_id = request.session["user_id"]
        if status:
            result = gt.success_validate(challenge, validate, seccode, user_id)
        else:
            result = gt.failback_validate(challenge, validate, seccode)
        
        if result:
            # 验证码正确
            # 利用auth模块做用户名和密码的校验
            user = auth.authenticate(username=username, password=password)
            if user:
                auth.login(request, user)
                ret["msg"] = "/index/"
            else:
                # 用户名密码错误
                ret["status"] = 1
                ret["msg"] = "用户名或密码错误!"
        else:
            ret["status"] = 1
            ret["msg"] = "验证码错误"

        return JsonResponse(ret)

    return render(request, "login.html")

GitHub 地址: https://github.com/protea-ban/oldboy/tree/master/s9day76/bbs

 

posted @ 2018-09-02 11:35  banshaohuan  阅读(2992)  评论(0编辑  收藏  举报