自定義認證後臺和QQ第三方登入
有很多網站的登入不但可以使用網站賬號密碼,還能用註冊的郵箱和手機號進行登入,現在就用Django實現這個功能。
Django預設的認證方式是使用username和password欄位進行認證的,我們可以加上一個通過email欄位獲取使用者的認證後臺來登入。一個認證後臺就是一個實現了authentication和get_user方法的python類,首先在應用目錄建立一個authenticate.py檔案,編輯程式碼:
from dajngo.contrib.auth.models import User class EmailAuthenBackend(object): def authentication(self,username=None,password=None): try: user = User.objects.get(email=username) if user.check_password(password): return user except User.DoesNotExist: return None def get_user(self,user_id): try: return User.objects.get(pk=user_id) except User.DoesNotExist: return None
authentication方法接受任意的引數,也就是說我們可以定製任意欄位來進行登入,例如電話使用者名稱之類的,這個函式將使用者資訊當成引數,如果認證成功返回True,失敗就返回False,get_user方法將使用者id當成引數,需要返回一個使用者物件。
最後在settings.py設定:
AUTHENTICATION_BACKENDS=['django.contrib.auth.backends.ModelBackend',#預設的後臺
'blog.authenticate.EmailAuthenBackend'#假設我們的應用名為blog]
注意,Django認證會對每個後臺按順序進行,例如在這裡先在第一個後臺查詢,找到了就停止,沒找到就接著查詢下一個,直到查詢完成為之,如果所有後臺都查詢不到才會彈出錯誤資訊。
第三方登入
這裡使用social-auth進行登入,這是一個非常簡單好用的第三方登入應用,裡面集成了大部分社交軟體如微博,QQ,Facebook等,使用方法都差不多。 首先申請QQ互聯,在open.qq.com申請。完成後會獲得app_id和secret_key。 安裝認證框架: pip install python-social-auth pip install social-auth-app-django 兩個都要安裝,如果沒安裝完的話又可能會migrate失敗 在INSTALLED_APP里加入這兩項: INSTALLED_APP=['social_django',
'social.apps.django_app.default'
]
更新資料庫:python manage.py migrate
在認證後端AUTHENTICATION_BACKENDS新增qq認證:
AUTHENTICATION_BACKENDS=[
'social_core.backends.qq.QQOAuth2'
]
新增ID和KEY:
SOCIAL_AUTH_QQ_KEY='app_id'
SOCIAL_AUTH_QQ_SECRET='secret_key'
SOCIAL_AUTH_QQ_USER_OPENID_AS_USERNAME=True
在根路由新增URL:
urlpatterns = [
url('',include('social_django.urls',namespace='social'))
]
在需要登入的地方加入:
<a href='{% url 'social:begin' 'qq' %}'>QQ登入</a>