1. 程式人生 > >luffy之極驗短信驗證(多條件登錄)

luffy之極驗短信驗證(多條件登錄)

link use 並且 object 9.png 定義 list request elf

多條件登錄

  JWT擴展的登錄視圖,在收到用戶名與密碼時,也是調用Django的認證系統中提供的authenticate()來檢查用戶名與密碼是否正確。

  我們可以通過修改Django認證系統的認證後端(主要是authenticate方法)來支持登錄賬號既可以是用戶名也可以是手機號。

修改Django認證系統的認證後端需要繼承django.contrib.auth.backends.ModelBackend,並重寫authenticate方法。

authenticate(self, request, username=None, password=None, **kwargs)

方法的參數說明:

  • request 本次認證的請求對象

  • username 本次認證提供的用戶賬號

  • password 本次認證提供的密碼

我們想要讓用戶既可以以用戶名登錄,也可以以手機號登錄,那麽對於authenticate方法而言,username參數即表示用戶名或者手機號。

重寫authenticate方法的思路:

  1. 根據username參數查找用戶User對象,username參數可能是用戶名,也可能是手機號

  2. 若查找到User對象,調用User對象的check_password方法檢查密碼是否正確

在users/utils.py中編寫:

def get_user_by_account(account):
    """
    根據帳號獲取user對象
    :param account: 賬號,可以是用戶名,也可以是手機號
    :return: User對象 或者 None
    """
    try:
        if re.match(^1[3-9]\d{9}$, account):
            # 帳號為手機號
            user = User.objects.get(mobile=account)
        else:
            
# 帳號為用戶名 user = User.objects.get(username=account) except User.DoesNotExist: return None else: return user class UsernameMobileAuthBackend(ModelBackend): """ 自定義用戶名或手機號認證 """ def authenticate(self, request, username=None, password=None, **kwargs): user = get_user_by_account(username) if user is not None and user.check_password(password): return user

在配置文件settings.py中告知Django使用我們自定義的認證後端

AUTHENTICATION_BACKENDS = [
    ‘users.utils.UsernameMobileAuthBackend‘,
]

  

在登陸功能中集成極驗驗證碼

  需要先去極驗創建賬號,並且創建一個新的驗證,創建好了以後,就可以得到APPID和APPKEY。

技術分享圖片

有了id和key以後,就可以根據官方的文檔進行集成了.

官方: https://docs.geetest.com/install/overview/start/

技術分享圖片

python集成文檔: https://docs.geetest.com/install/deploy/server/python/

SDK: 開發集成工具包

安裝依賴模塊:

pip install requests

安裝完成模塊以後,可以參考官方文檔中的案例,把提供驗證碼和校驗驗證碼的功能集成到視圖類中.

文檔: https://github.com/GeeTeam/gt3-python-sdk

luffy之極驗短信驗證(多條件登錄)