欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue+drf+第三方滑動驗(yàn)證碼接入的實(shí)現(xiàn)

 更新時(shí)間:2021年10月15日 09:05:55   作者:仙仙仙人的博客  
這篇文章要給大家介紹的是vue和drf以及第三方滑動驗(yàn)證碼接入的實(shí)現(xiàn),下文小編講詳細(xì)講解該內(nèi)容,感興趣的小伙伴可以和小編一起來學(xué)習(xí)奧

1、背景

近期在項(xiàng)目開發(fā)練習(xí)中用到了登錄功能 + 驗(yàn)證碼的需求,驗(yàn)證碼一般分為三種類型:圖片驗(yàn)證碼、短信驗(yàn)證碼、滑動驗(yàn)證碼,相關(guān)實(shí)現(xiàn)思路如下

圖片驗(yàn)證碼

對于圖片驗(yàn)證碼的實(shí)現(xiàn)可以借助python中的第三方模塊pillow的相關(guān)方法進(jìn)行實(shí)現(xiàn)(有時(shí)間會寫文章)

短信驗(yàn)證碼

短信驗(yàn)證碼的主要思路是通過調(diào)用第三方短信接口向手機(jī)發(fā)送短信,接收用戶輸入并與系統(tǒng)生成的隨機(jī)數(shù)串比對

滑動驗(yàn)證碼

滑動驗(yàn)證碼一般是利用第三方的驗(yàn)證碼服務(wù)提供商,例如騰訊防水墻、極驗(yàn)驗(yàn)證等。和我們自己實(shí)現(xiàn)驗(yàn)證碼的思路相比較,第三方驗(yàn)證碼更為安全可靠

本文以騰訊防水墻為例,記錄在vuedrf組合的前后端分離項(xiàng)目中接入第三方滑動驗(yàn)證碼服務(wù)

2、驗(yàn)證流程

驗(yàn)證的前后端調(diào)用時(shí)序圖如下(圖片來源于騰訊驗(yàn)證碼官方文檔)

3、創(chuàng)建驗(yàn)證

首先登陸到騰訊云控制臺創(chuàng)建一個(gè)云 API 密鑰,在左側(cè)導(dǎo)航欄選擇【訪問管理】>【API 密鑰管理】,進(jìn)入 API 密鑰管理頁面,單擊【新建密鑰】創(chuàng)建密鑰。

然后進(jìn)入驗(yàn)證碼控制臺,單擊【新建驗(yàn)證】,根據(jù)需求輸入驗(yàn)證名稱、驗(yàn)證所屬域名、驗(yàn)證渠道(Web 端或小程序插件)及驗(yàn)證場景,填寫完成后,單擊【確定】完成驗(yàn)證創(chuàng)建。

最后,查看申請到的資源信息

4、前端代碼

4.1 添加核心js文件

把防水墻的前端核心js文件在項(xiàng)目根目錄下index.html中使用script標(biāo)簽引入

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>
    <title>opsweb</title>
  </head>
  <body>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>


或者在src/main.js中通過import引入,導(dǎo)入前需要將上面的核心js文件下載到項(xiàng)目靜態(tài)文件目錄中

// 導(dǎo)入防水墻驗(yàn)證碼的核心js文件
import "../static/js/TCaptcha";

4.2 添加配置

src/settings.js中添加配置

export default {
  HOST: 'http://opsapi.ssgeek.com:8000',  // 后端api地址
  TC_captcha:{
    app_id: "2020427221",  // 騰訊防水墻APPID配置
  },
}


4.3 組件修改

修改登錄頁面vue組件Login.vue,將登錄按鈕綁定到驗(yàn)證碼顯示的自定義方法上,先觸發(fā)驗(yàn)證碼請求再觸發(fā)登錄

template部分

<template>
<!--登錄內(nèi)容開始-->
<div class="inp" v-if="login_type==0">
  <input v-model="username" type="text" placeholder="用戶名" class="user">
  <input v-model="password" type="password" name="" class="pwd" placeholder="密碼">
  <div class="rember">
    <p>
      <input v-model="remember_me" type="checkbox" class="no" name="a"/>
      <span>記住密碼</span>
    </p>
  </div>
  <button class="login_btn" @click="show_captcha">登錄</button>
<!--登錄內(nèi)容結(jié)束-->
</div>
</template>


script部分

<script>
export default {
  name: 'Login',
  data() {
    return {
      login_type: 0,
      remember_me: false,
      username: "",
      password: "",
    }
  },
  methods: {
    show_captcha() {
      var captcha1 = new TencentCaptcha(this.$settings.TC_captcha.app_id, res=> {
        /*
        res:
        appid: "2020427221"  # 驗(yàn)證碼的APPID
        randstr: "@GCV"      # 隨機(jī)字符串,防止重復(fù)
        ret: 0               # 0表示用戶操作成功,2表示用戶主動關(guān)閉驗(yàn)證碼窗口
        ticket: ""           # 驗(yàn)證通過以后的票據(jù),提供給后端,將來到驗(yàn)證碼服務(wù)器中進(jìn)行
        */
        // console.log(res);
        this.$axios.get(`${this.$settings.HOST}/users/captcha/`,{
          params:{
            ticket: res.ticket,
            randstr: res.randstr,
          }
        }).then(response=>{
          if(response.data.detail){
            // 繼續(xù)進(jìn)行登錄處理
            this.login();
          }
        }).catch(error=>{
          this.$message.error("對不起,驗(yàn)證碼校驗(yàn)不通過!");
        });
      });
      captcha1.show();
    },
    login() {
      // 判斷用戶是否輸入用戶名或密碼,否則提示用戶輸入
      if (!this.username) {
        this.$message.error('請輸入用戶名!')
      } else if (!this.password) {
        this.$message.error('請輸入密碼!')
      } else {
        // 攜帶用戶名和密碼,提交post請求
        this.$axios.post(`${this.$settings.HOST}/users/login/`, {
          username: this.username,
          password: this.password,
        }).then((res) => {
          // 存儲token
          if (this.remember_me) {
            localStorage.token = res.data.token;
            sessionStorage.removeItem('token')
          } else {
            sessionStorage.token = res.data.token;
            localStorage.removeItem('token')
          }
          // 跳轉(zhuǎn)到首頁
          this.$router.push('/hippo/showcenter')
        }).catch((error) => {  // 捕獲請求返回的錯(cuò)誤,4xx,5xx
          this.$message.error('用戶名或者密碼有誤,請重新輸入!')
        })
      }
    },
  },
};

5、后端代碼

相關(guān)操作指引可以參考官方示例:https://007.qq.com/python-access.html

5.1 添加配置

將騰訊驗(yàn)證碼控制臺查看到的驗(yàn)證信息配置到drf后端代碼的配置文件中

# 騰訊防水墻配置
TENCENT_CAPTCHA = {
    "GATEWAY": "https://ssl.captcha.qq.com/ticket/verify",  # 驗(yàn)證碼驗(yàn)證地址
    "APPID": "2020427221",  # 驗(yàn)證碼應(yīng)用的APPID
    "App_Secret_Key": "0mnAr1EpNTjm63fQgKPU87w**",  # 驗(yàn)證碼應(yīng)用的AppSecretKey
}


5.2 接收驗(yàn)證并返回

在用戶app下編寫用戶驗(yàn)證碼的普通類視圖view

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.conf import settings
from urllib.parse import urlencode
from urllib.request import urlopen
import json
import ssl


# Create your views here.
class CaptchaAPIView(APIView):
    """驗(yàn)證碼"""
    ssl._create_default_https_context = ssl._create_unverified_context

    def get(self, request):
        """接收客戶端提交的驗(yàn)證碼相關(guān)信息"""
        params = {
            "aid": settings.TENCENT_CAPTCHA.get("APPID"),
            "AppSecretKey": settings.TENCENT_CAPTCHA.get("App_Secret_Key"),
            "Ticket": request.query_params.get("ticket"),
            "Randstr": request.query_params.get("randstr"),
            "UserIP": request._request.META.get("REMOTE_ADDR")
        }
        # 把字典數(shù)據(jù)轉(zhuǎn)換成地址欄的查詢字符串格式
        # aid=xxx&AppSecretKey=xxx&xxxxx
        params = urlencode(params)
        # print(params)
        url = settings.TENCENT_CAPTCHA.get("GATEWAY")
        # 發(fā)送http的get請求
        f = urlopen("%s?%s" % (url, params))
        # https://ssl.captcha.qq.com/ticket/verify?aid=xxx&AppSecretKey=xxx&xxxxx
        # f.read() 讀取響應(yīng)信息
        content = f.read()
        res = json.loads(content)
        # print(res)
        if int(res.get("response")) == 1:
            # 驗(yàn)證成功
            return Response({"detail": 1})
        else:
            # 驗(yàn)證失敗
            return Response({"detail": 0}, status=status.HTTP_400_BAD_REQUEST)

5.3 添加url路由

最后,添加用于前端發(fā)送請求的后端url路由

from django.urls import path
from rest_framework_jwt.views import obtain_jwt_token
from . import views

urlpatterns = [
    path('login/', obtain_jwt_token),
    path('captcha/', views.CaptchaAPIView.as_view()),  # 驗(yàn)證碼校驗(yàn)
]

6、運(yùn)行測試

最終效果如下

在騰訊驗(yàn)證碼的后臺可以看到詳細(xì)的請求信息圖表

到此這篇關(guān)于vue+drf+第三方滑動驗(yàn)證碼接入的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)vue+drf+第三方滑動驗(yàn)證碼接入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 構(gòu)建Vue3桌面應(yīng)用程序的方法

    構(gòu)建Vue3桌面應(yīng)用程序的方法

    在項(xiàng)目中會用到 Electron , 一種最流行的框架,可使用Javascript構(gòu)建跨平臺的桌面應(yīng)用程序。在本文中,我們將研究如何通過 Vite 開發(fā) Vue 3 桌面項(xiàng)目,感興趣的可以了解一下
    2021-05-05
  • Vue父組件監(jiān)聽子組件生命周期

    Vue父組件監(jiān)聽子組件生命周期

    這篇文章主要介紹了Vue父組件監(jiān)聽子組件生命周期,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • vue3的ref、isRef、toRef、toRefs、toRaw詳細(xì)介紹

    vue3的ref、isRef、toRef、toRefs、toRaw詳細(xì)介紹

    本文詳細(xì)講解了vue3的ref、isRef、toRef、toRefs、toRaw,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • vuex管理狀態(tài)倉庫使用詳解

    vuex管理狀態(tài)倉庫使用詳解

    這篇文章主要介紹了vuex管理狀態(tài)倉庫使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • vue中拆分組件的實(shí)戰(zhàn)案例

    vue中拆分組件的實(shí)戰(zhàn)案例

    最近在學(xué)vue,試著寫個(gè)單頁應(yīng)用,在寫組件,拆分組件時(shí)遇到一些困惑,下面這篇文章主要給大家介紹了關(guān)于vue中拆分組件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • vue-element-admin按鈕級權(quán)限管控的實(shí)現(xiàn)

    vue-element-admin按鈕級權(quán)限管控的實(shí)現(xiàn)

    開發(fā)離不開權(quán)限,不同的用戶登錄,根據(jù)不同的權(quán)限,可以訪問不同的管理目錄,本文主要介紹了vue-element-admin按鈕級權(quán)限管控的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-04-04
  • 詳解vue beforeEach 死循環(huán)問題解決方法

    詳解vue beforeEach 死循環(huán)問題解決方法

    這篇文章主要介紹了vue beforeEach 死循環(huán)問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • vue2.0設(shè)置proxyTable使用axios進(jìn)行跨域請求的方法

    vue2.0設(shè)置proxyTable使用axios進(jìn)行跨域請求的方法

    這篇文章主要介紹了vue2.0設(shè)置proxyTable使用axios進(jìn)行跨域請求,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • 關(guān)于Vue3路由push跳轉(zhuǎn)問題(解決Vue2this.$router.push失效)

    關(guān)于Vue3路由push跳轉(zhuǎn)問題(解決Vue2this.$router.push失效)

    這篇文章主要介紹了Vue3路由push跳轉(zhuǎn)問題(解決Vue2this.$router.push失效),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • vue axios 表單提交上傳圖片的實(shí)例

    vue axios 表單提交上傳圖片的實(shí)例

    下面小編就為大家分享一篇vue axios 表單提交上傳圖片的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03

最新評論