使用者註冊和身份驗證是 Web 應用程式最重要的元件之一。本教程涉及 django-allauth 的設定、配置和自訂,以及 django Web 應用程式的進階調整和社交登入設定。本教程旨在為希望快速開始使用 django-allauth 並在此過程中輕鬆進行有用自訂的新用戶提供指南。

為什麼要寫這個指南?

感謝Raymond Penners的幫助django-allauth是一個寫得非常好的函式庫。然而,對於第一次使用django-allauthdjango新手或高級用戶來說,這可能會讓人不知所措。儘管它有很好的文件記錄,但由於涉及開發人員的時間和資源限制,關於該庫的文章和深入教程並不多。因此,本教程試圖透過製作一個全面的指南來解決這個問題,以快速入門並了解高級自訂。

基本設定

您可以下載本教學中使用的檔案以搶佔先機。以下步驟將詳細引導您完成設定。

  1. 如果您還沒有 Django 專案,請建立一個。

  2. 使用指令 pip install django-allauth pip install django-allauth

allauthallauth.accountallauth.socialaccount以及您需要的所有社群登入功能新增至settings.py中的INSTALLED_APPS部分。

您可以在此處查看支援的 API 的完整清單。

社群登入功能將在貼文後面進行描述。如果您想閱讀該副標題,可以向下捲動到該副標題。配置已安裝的應用程式部分後,它應該類似於下面給出的程式碼。

INSTALLED_APPS = [
    'django.contrib.admin',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.google',
    'allauth.socialaccount.providers.facebook',
    'django.contrib.auth',
    'django.contrib.sites',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

settings.py中配置template上下文處理器設置,並在專案的urls.py中加入 url 模式。

TEMPLATES = [
  {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.normpath(os.path.join(BASE_DIR, 'templates')),
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'django.template.context_processors.request',
            ],
        },
    },
]

新增以下身份驗證後端。

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
)

django-allauth儲存庫複製範本文件,或者您也可以使用我的自訂儲存庫(我做了一些修改和一些良好的結構)並將其貼上到專案目錄中的資料夾templates

在主專案目錄的urls.py中加入 allauth url。新增 allauth url 後,url 檔案應類似於:

from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^accounts/', include('allauth.urls')),
]

您也可以自行新增自訂 CSS 或我在使用 allauth 範本期間建立的 CSS(註解和文件良好,但很簡單)。它包括幾乎所有頁面的樣式,甚至包括用於確認和密碼重設電子郵件的適合行動裝置的電子郵件範本。您可以透過在專案目錄中建立static資料夾並將 CSS 放置在資料夾accounts中來做到這一點。

執行python manage.py makemigrationspython manage.py migrate進行所有必要的遷移,並執行python manage.py runserver啟動 django 伺服器。

依照 URL 模式顯示註冊表單。

例如:造訪localhost:8000/accounts/login顯示登入頁面。

基本配置

大多數django-allauth功能都可以使用內建適配器和變數進行配置,方法是將它們放在檔案settings.py中。儘管文件中有大量此類選項並提供了很好的解釋,但我在下面強調了一些重要的選項。

電子郵件確認到期:設定帳戶應啟動的天數。

例如ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS=7

啟動所需的電子郵件:此選項可讓您設定是否應驗證電子郵件地址才能註冊。設定 False 以停用電子郵件要求。

例如ACCOUNT_EMAIL_REQUIRED = True

帳戶信箱驗證:此選項可用於設定使用者註冊帳號後是否需要進行信箱驗證才能登入。您可以使用「強制」來阻止使用者登錄,直到電子郵件得到驗證。您可以設定發送電子郵件但允許使用者無需電子郵件即可登入的選項。您也可以設定 none 以不發送驗證電子郵件。 (不建議)

例如ACCOUNT_EMAIL_VERIFICATION = "mandatory"

登入嘗試限制:這是一項重要功能,可用於防止對您網站上的使用者登入頁面進行暴力攻擊。可以設定最大登入嘗試次數,並且在逾時之前阻止使用者重新登入。此功能利用ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT設定。

例如ACCOUNT_LOGIN_ATTEMPTS_LIMIT = 5

登入嘗試限制逾時:此設定應與設定ACCOUNT_LOGIN_ATTEMPTS_LIMIT一起使用。設定的值以上次登入嘗試失敗後的秒數為單位。請注意,這並不能保護管理員登入。

例如ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT = 86400 # 1 天(以秒為單位)

登入和登出 URL 重新導向:當使用者登入或登出時,您可能想要將使用者重新導向至特定 URL 或頁面,並且可以使用下列設定來設定該 URL。預設情況下,allauth 將登入重新導向至/accounts/profile/ URL 並登出 localhost:8000 或任何 localhost 主頁。

例如ACCOUNT_LOGOUT_REDIRECT_URL ='/accounts/login/'

例如LOGIN_REDIRECT_URL = '/accounts/email/'

完成後,您的 allauth 設定應類似於以下設定。

ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS =1
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
ACCOUNT_LOGIN_ATTEMPTS_LIMIT = 5
ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT = 86400 # 1 day in seconds
ACCOUNT_LOGOUT_REDIRECT_URL ='/accounts/login/'
LOGIN_REDIRECT_URL = '/accounts/email/' # default to /accounts/profile 

擴充 django-alluth 類別和進階自訂

本節涉及自訂 django-allauth 註冊表單、幹預註冊流程以新增您自己的自訂流程和驗證。

有關 allauth 最常見的查詢之一是向註冊表單加入其他欄位或自訂欄位。您可以從allauth.account.forms擴充SignupForm類別。您需要做的就是建立一個自訂類,將SignupForm傳遞給自訂類別並定義自訂欄位並儲存。傳回使用者物件至關重要,因為它將傳遞給其他模組進行驗證。您還需要在settings.py中包含變數ACCOUNT_FORMS

讓我們用一個例子來看看這一點。在forms.py中。

from allauth.account.forms import SignupForm
from django import forms

class CustomSignupForm(SignupForm):
    first_name = forms.CharField(max_length=30, label='First Name')
    last_name = forms.CharField(max_length=30, label='Last Name')
    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()
        return user

在上面的程式碼片段中, CustomSignupForm是一個擴充類,它繼承了SignupForm類別的所有功能並加入了必要的功能。這裡使用同一類別中的註冊模組建立並保存名為first_namelast_name的自訂欄位。

上述程式碼的settings.py中的ACCOUNT_FORMS

ACCOUNT_FORMS = {
'signup': 'YourProject.forms.CustomSignupForm',
}

建立的任何其他自訂表單都可以在ACCOUNT_FORMS中擴充。該清單在文件中進行了說明。

同樣, LoginForm UserForm AddEmailForm等也可以擴充。但是,請記住,當您擴展這些表單並將它們連結到settings.py時。不要忘記將原始表單(例如SignupForm )作為參數傳遞給您的類,有時您可能必須處理自訂驗證並傳回使用者或其他值。請參閱原始程式碼以遵循正確的流程。

使用者乾預和自訂驗證

我最近遇到了一些關於堆疊溢出和儲存庫問題部分的好問題,涉及加入自訂驗證和乾預用戶註冊流程。在研究解決方案並瀏覽文件時,我發現DefaultAccountAdapter非常有用,並且確實可以用於解決用戶在使用django-allauth時可能遇到的大多數自訂問題。我複製了答案並附上下面的一些說明。

範例 1:允許限制電子郵件列表

找到儲存和取得受限清單的方法後,您可以使用適配器並在受限電子郵件嘗試註冊時在註冊表中引發驗證錯誤。擴展DefaultAccountAdapter並重寫clean_email方法。在專案目錄中建立一個adapter.py並擴展預設的適配器類別。您也可以限制電子郵件提供者(例如臨時電子郵件提供者)使用正規表示式進行註冊。我不會介紹如何辨識電子郵件證明者 ( [email protected] ),因為它超出了本文的範圍。但流程保持不變。

from allauth.account.adapter import DefaultAccountAdapter
from django.forms import ValidationError

class RestrictEmailAdapter(DefaultAccountAdapter):
    def clean_email(self,email):
        RestrictedList = ['Your restricted list goes here.']
        if email in RestrictedList
            raise ValidationError('You are restricted from registering. Please contact admin.')
        return email

最後,將settings.py檔案中的帳戶適配器指向您的擴充類別。 ACCOUNT_ADAPTER = 'YourProject.adapter.RestrictEmailAdapter'

範例 2:為使用者名稱新增最大長度

由於 allauth 庫中不存在ACCOUNT_USERNAME_MAX_LENGTH ,因此可以使用DefaultAccountAdapter輕鬆實現此功能。擴展DefaultAccountAdapter類別並重寫clean_username方法。您還需要在自訂驗證之後再次引用clean_username以完成其他內建驗證

注意:上一段的最後一句是使用DefaultAccountAdapter的關鍵。您永遠不應該忘記引用模組的原始模組名稱來完成其他驗證。

from allauth.account.adapter import DefaultAccountAdapter
from django.forms import ValidationError

class UsernameMaxAdapter(DefaultAccountAdapter):
    def clean_username(self, username):
        if len(username) > 'Your Max Size':
            raise ValidationError('Please enter a username value less than the current one')
        return DefaultAccountAdapter.clean_username(self,username) # For other default validations.

最後,指向settings.py中的子類

ACCOUNT_ADAPTER = 'YourProject.adapter.UsernameMaxAdapter'

您可以參考原始程式碼中的adapters.py檔案並擴充其他模組並新增處理器來變更其流程。 populate_usernameclean_password (可自訂限制常用密碼)等模組可以具有自訂流程和流程,而無需重寫它們。

如果在正確的情況下使用 DefaultAccountAdapter 來幹預 allauth 的預設進程, DefaultAccountAdapter可以成為一個強大的工具。 allauth 帶有各種各樣的內建設置,它們都可以在這裡查看。您也可以從參考文獻中的連結下載整個原始程式碼。

使用 django-allauth 設定社群登入

加入必要的應用程式:

如 allauth 文件和上一節所示,我們需要新增與我們將要使用的登入相關的必要應用程式。本節示範如何使用allauth.socialaccount.providers.google進行 Google API 配置,以及如何使用allauth.socialaccount.providers.facebook進行 Facebook API 配置。您需要將它們新增至INSTALLED_APPS

執行此操作後,您安裝的應用程式應該如下所示:

INSTALLED_APPS = [
    'django.contrib.admin',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.google',
    'allauth.socialaccount.providers.facebook',
    'django.contrib.auth',
    'django.contrib.sites',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

設定SOCIALACCOUNT_QUERY_EMAIL=ACCOUNT_EMAIL_REQUIREDSOCIALACCOUNT_EMAIL_REQUIRED=ACCOUNT_EMAIL_REQUIREDSOCIALACCOUNT_STORE_TOKENS=False 。我們也會在SOCIALACCOUNT_PROVIDERS下配置 Facebook 和 Google 的一些設定。有關設定的詳細訊息,請參閱此處的文件。

您的SOCIALACCOUNT_PROVIDERS設定應類似:

SOCIALACCOUNT_PROVIDERS = {
    'facebook': {
        'METHOD': 'oauth2',
        'SCOPE': ['email', 'public_profile', 'user_friends'],
        'AUTH_PARAMS': {'auth_type': 'reauthenticate'},
        'INIT_PARAMS': {'cookie': True},
        'FIELDS': [
            'id',
            'email',
            'name',
            'first_name',
            'last_name',
            'verified',
            'locale',
            'timezone',
            'link',
            'gender',
            'updated_time',
        ],
        'EXCHANGE_TOKEN': True,
        'LOCALE_FUNC': 'path.to.callable',
        'VERIFIED_EMAIL': False,
        'VERSION': 'v2.12',
    },
     'google': {
        'SCOPE': [
            'profile',
            'email',
        ],
        'AUTH_PARAMS': {
            'access_type': 'online',
        }
    }
}

執行python manage.py make makemigrationspython manage.py migrate以建立資料庫條目。我們現在可以建立 Facebook 和 Google API 金鑰。我在下面簡要描述了這個過程。我建議您遵循各自官方網站上的說明,因為他們的服務和政策可能會改變。

API 建立和配置:

請按照以下步驟操作,並在網路上尋找有關如何執行此操作的額外裁判或教程。簡要說明如下。

Facebook

  1. 透過造訪 Developers.facebook.com 並填寫所有詳細資訊來建立測試應用程式。

  2. 複製應用程式 ID 和金鑰。

點擊 Facebook 社群登入選項上的設定。

將所有其他設定保留為預設值並完成應用程式建立。

在基本設定中將 localhost 新增至應用程式網域。

Google

  1. 建立登入 API 並複製秘密憑證。

  2. 建立 API 時不要忘記放置正確的回呼 URL。將http://localhost:8000/accounts/google/login/callback/放入回呼 URL 中。

新增谷歌API

管理配置
  1. 透過執行python manage.py createsuperuser建立超級使用者(admin)並填寫詳細資料。

  2. 前往http://localhost:8000/admin並登入管理控制台。

  3. 前往網站並將example.com網域名稱和顯示名稱變更為http://localhost:8000

  4. 現在轉到社交應用程式並加入社交應用程式並填寫詳細資訊。

  5. 對 Facebook 和 Google 重複同樣的操作。

將 localhost 新增至站點

你已經準備好了。現在您可以繼續使用 Facebook 和 Google 登入。

這是 dev.to 上最早的最全面的帖子之一。請隨意以我的方式發送擁抱或錯誤。

參考文獻與延伸閱讀:

  1. django-allauth GitHub 頁面

  2. django-allauth 官方文件

  3. 我的自訂模板和 CSS

  4. 範例 1 上的 Stack Overflow 執行緒

  5. 範例 2 上的 Stack Overflow 執行緒

  6. 原始碼中的Adapters.py文件

  7. Facebook APIGoogle API全身份驗證文件。

  8. 該指南的完整原始碼


原文出處:https://dev.to/gajesh/the-complete-django-allauth-guide-la3


共有 0 則留言