luffy之極驗短信驗證(多條件登錄)
多條件登錄
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方法的思路:
-
根據username參數查找用戶User對象,username參數可能是用戶名,也可能是手機號
-
若查找到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‘, ]
有了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之極驗短信驗證(多條件登錄)