【Django】使用geetest實現滑動驗證


需導入模塊social-auth-app-djangogeetest 提前去官網下載gt.js或者引入http://static.geetest.com/static/tools/gt.js


效果圖:


html:

    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <div class="panel panel-default login">
                    <div class="panel-heading">
                        <p class="h3">登錄&nbsp;&nbsp;Rango博客賬號</p>
                        <p>請在下面的輸入框中輸入您的用戶名和密碼</p>
                    </div>
                    <div class="panel-body">
                        <div>
                            {% csrf_token %}
                            <div class="form-group">
                                <input type="text" class="form-control input-lg" name="user" placeholder="用戶名">
                            </div>
                            <div class="form-group">
                                <input type="password" class="form-control input-lg" name="pwd" placeholder="密碼">
                            </div>
                            <div class="form-group popup-div">
                                <!-- 放置極驗的滑動驗證碼 -->
                                <span id="wait">驗證碼加載中...</span>
                                <div id="popup-captcha"></div>

                            </div>
                            <div class="form-group">
                                <button class="btn btn-block btn-primary btn-lg" id="login-button" disabled title="請完成人機識別驗證">登錄</button>
                            </div>
                            <a href="/register/">注冊</a>
                            |
                            <a href="">找回密碼</a>
                            <strong id="error" class="pull-right"></strong>
                        </div>
                    </div>
                </div>
            </div>
        </div>


    </div>


<!-- geetest -->
{#    <script src="http://static.geetest.com/static/tools/gt.js"></script>#}
    <script src="/static/js/gt.js"></script>
    <script src="/static/js/login.js"></script>

js:


// 極驗滑動驗證碼
var handlerPopup = function (captchaObj) {
    // appendTo方法用於將驗證按鈕插到宿主頁面,使其顯示在頁面上。
    captchaObj.appendTo('#popup-captcha');
    // onReady監聽驗證按鈕的 DOM 生成完畢事件
    captchaObj.onReady(function () {
        $("#wait").attr('class', 'hidden');
    });

    // onSuccess:監聽驗證成功事件,進行二次驗證
    captchaObj.onSuccess(function () {
        $("#login-button").removeAttr('disabled');
        $("#login-button").removeAttr('title');
    });

    $("#login-button").click(function () {
        // getValidate:獲取用戶進行成功驗證(onSuccess)所得到的結果,該結果用於進行服務端 SDK 進行二次驗證。
        var validate = captchaObj.getValidate();
        if (!validate) {
            return 0;
        } else {
            $.ajax({
                url: "/login/", // 進行二次驗證
                type: "post",
                dataType: "json",
                data: {
                    username: $('input[name="user"]').val(),
                    password: $('input[name="pwd"]').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) {
                        $('#error').text(data.msg);
                        captchaObj.reset();  // 讓驗證回到初始狀態
                    } else {
                        location.href = data.msg;
                    }
                },
            });
        }
    });
};

// 當input框獲取焦點時將之前的錯誤清空
$('input[name="user"],input[name="pwd"]').focus(function () {
    // 將之前的錯誤清空
    $('#error').text('');
});

// 驗證開始需要向網站主后台獲取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,  // 驗證 id,極驗后台申請得到
            challenge: data.challenge,  // 驗證流水號,后服務端 SDK 向極驗服務器申請得到
            product: "popup", // 產品形式,包括:float,embed,popup。注意只對PC版驗證碼有效
            offline: !data.success, // 表示用戶后台檢測極驗服務器是否宕機,一般不需要關注
            width: '100%',  // 設置按鈕的長度
            // 更多配置參數請參見:http://www.geetest.com/install/sections/idx-client-sdk.html#config
        }, handlerPopup);
    },
});

views:

from django.shortcuts import render, HttpResponse
from django.http import JsonResponse
from django.contrib import auth

from geetest import GeetestLib

# 請在官網申請ID使用
pc_geetest_id = "xxxxxxxxxxxxxxxxxxx"
pc_geetest_key = "xxxxxxxxxxxxxxxxxxx"


def login(request):
	if request.method == "POST":

		ret = {
			'status': None,
			'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)  # 將登錄用戶賦值給 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")


# 處理極驗 獲取驗證碼的視圖
def get_geetest(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)

urls:


urlpatterns = [
	path('admin/', admin.site.urls),
	path('login/', views.login),  # 登錄視圖
	path('register/', views.register),  # 注冊視圖
	path('index/', views.index),  # 首頁
	re_path(r'^$', views.index),  # 首頁

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM