程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Django API 開發:實現用戶登錄與注冊

編輯:Python

實現token認證

現在,我們需要更新身份驗證系統以使用令牌。 第一步是更新我們的DEFAULT_AUTHENTICATION_CLASSES 設置以使用 TokenAuthentication ,如下所示:


# blog_project/settings.pyREST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ], 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', # new ], }


我們保留 SessionAuthentication,因為我們的 Browsable API 仍需要它,但現在使用令牌在 HTTP 標頭中來回傳遞身份驗證憑據。


我們還需要添加 authtoken 應用,該應用會在服務器上生成令牌。 它包含在 Django REST Framework 中,但必須添加到我們的 INSTALLED_ APPS 設置中:


# blog_project/settings.pyINSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 3rd-party apps 'rest_framework', 'rest_framework.authtoken', # new # Local 'posts.apps.PostsConfig', ]


由於我們對 INSTALLED_APPS 進行了更改,因此我們需要同步數據庫。 使用 Control + c 停止服務器。 然後運行以下命令。


(blogapi) $ python manage.py migrate


現在再次啟動服務器。


(blogapi) $ python manage.py runserver


如果您訪問 http://127.0.0.1:8000/admin/ 上的 Django admin,則會看到頂部現在有一個 Tokens部分。 確保您使用超級用戶帳戶登錄才能訪問。




單擊令牌鏈接以轉到令牌頁面,網址為:http://127.0.0.1:8000/admin/authtoken/token/




當前沒有令牌可能令人驚訝。 畢竟我們有現有用戶。 但是,僅在有用於用戶登錄的API調用之後才生成令牌。我們尚未這樣做,因此尚無令牌。 我們將很快!

終端

我們還需要創建端點,以便用戶可以登錄和注銷。 為此,我們可以創建一個專用的用戶應用程序,然後添加我們自己的網址,視圖和序列化程序。 但是,用戶身份驗證是我們真正不想犯錯誤的領域。 並且由於幾乎所有的 API 都需要此功能,因此可以使用一些優秀且經過測試的第三方程序包是有道理的。


值得注意的是,我們將結合使用 django-rest-auth 和 django-allauth 來簡化操作。 對於使用第三方軟件包,請不要感到難過。 它們存在是有原因的,甚至最好的 Django專業人士始終都依賴它們。 不必重新設計輪子!

Django-Rest-Auth

首先,我們將添加登錄,注銷和密碼重置API端點。 這些與流行的 django-rest-auth 軟件包一起提供。 使用 Control + c 停止服務器,然後安裝它。


(blogapi) $ pipenv install django-rest-auth==0.9.5


將新應用添加到我們的 blog_project/settings.py 文件中的 INSTALLED_APPS 配置中。


# blog_project/settings.pyINSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 3rd-party apps 'rest_framework', 'rest_framework.authtoken', 'rest_auth', # new # Local 'posts.apps.PostsConfig', ]


使用 rest_auth 軟件包更新我們的 blog_project/urls.py 文件。 我們將網址路由設置為 api/v1/rest-auth


# blog_project/urls.pyfrom django.contrib import admin from django.urls import include, pathurlpatterns = [ path('admin/', admin.site.urls), path('api/v1/', include('posts.urls')), path('api-auth/', include('rest_framework.urls')), path('api/v1/rest-auth/', include('rest_auth.urls')), # new]


我們完成了! 如果您曾經嘗試實現自己的用戶身份驗證端點,那麼 django-rest-auth 為我們節省了多少時間和令人頭疼的問題,真是令人驚訝。


現在我們可以啟動服務器以查看 django-rest-auth 提供了什麼。


(blogapi) $ python manage.py runserver


我們在 http://127.0.0.1:8000/api/v1/rest-auth/login/ 上有一個有效的登錄端點。




並在 http://127.0.0.1:8000/api/v1/rest-auth/logout/ 中注銷端點。




還有用於密碼重置的端點:


http://127.0.0.1:8000/api/v1/rest-auth/password/reset


並確認密碼重置:


http://127.0.0.1:8000/api/v1/rest-auth/password/reset/confirm



用戶注冊

接下來是我們的用戶注冊或注冊端點。 傳統 Django 不附帶用於用戶注冊的內置視圖或 URL,Django REST Framework 也沒有。 這意味著我們需要從頭開始編寫自己的代碼; 考慮到錯誤的嚴重性和安全性,這種方法有些冒險。


一種流行的方法是使用第三方軟件包 django-allauth ,該軟件包隨附用戶注冊以及 Django 身份驗證系統的許多其他功能,例如通過 Facebook,Google,Twitter 等進行社會身份驗證。如果添加 rest_auth。 從 django-rest-auth 軟件包進行注冊,那麼我們也有用戶注冊端點!


使用 Control + c 停止本地服務器,然後安裝 django-allauth 。


(blogapi) $ pipenv install django-allauth==0.40.0


然後更新我們的 INSTALLED_APPS 設置。 我們必須添加幾個新的配置:


  • django.contrib.sites

  • allauth

  • allauth.account

  • allauth.socialaccount

  • rest_auth.registration


確保還包括 EMAIL_BACKEND 和 SITE_ID 。 從技術上講,它們在 settings.py 文件中的放置位置無關緊要,但是通常會在底部添加其他配置。


# blog_project/settings.pyINSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', # new # 3rd-party apps 'rest_framework', 'rest_framework.authtoken', 'allauth', # new 'allauth.account', # new 'allauth.socialaccount', # new 'rest_auth', 'rest_auth.registration', # new # Local 'posts.apps.PostsConfig', ]...EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' # newSITE_ID = 1 # new


需要電子郵件後端配置,因為默認情況下,注冊新用戶時會發送一封電子郵件,要求他們確認其帳戶。 與其設置電子郵件服務器,不如使用 console.EmailBackend 設置將電子郵件輸出到控制台。


SITE_ID 是內置 Django “站點”框架的一部分,該框架是托管來自同一 Django 項目的多個網站的一種方式。 顯然,我們這裡只有一個站點,但 django-allauth 使用站點框架,因此我們必須指定默認設置。好。 我們添加了新的應用程序,現在該更新數據庫了。


(blogapi) $ python manage.py migrate


然後添加新的 URL 路由進行注冊。


# blog_project/urls.pyfrom django.contrib import admin from django.urls import include, pathurlpatterns = [ path('admin/', admin.site.urls), path('api/v1/', include('posts.urls')), path('api-auth/', include('rest_framework.urls')), path('api/v1/rest-auth/', include('rest_auth.urls')), path('api/v1/rest-auth/registration/', include('rest_auth.registration.urls')),]


我們完成了。 我們可以運行本地服務器。


(blogapi) $ python manage.py runserver


現在在以下位置有一個用戶注冊端點:


http://127.0.0.1:8000/api/v1/rest-auth/registration/



Tokens

為確保一切正常,請通過可浏覽的API端點創建第三個用戶帳戶。 我已經將我的用戶稱為 testuser2 。 然後點擊“ POST”按鈕。




下一個屏幕顯示來自服務器的 HTTP 響應。 我們的用戶注冊 POST 成功,因此在頂部創建了狀態代碼HTTP 201。 返回值密鑰是此新用戶的身份驗證令牌。




如果您查看命令行控制台,那麼 django-allauth 將自動生成一封電子郵件。 可以更新此默認文本,並添加具有 Django 初學者介紹的其他配置的電子郵件 SMTP 服務器。


Content-Type: text/plain; charset="utf-8"MIME-Version: 1.0Content-Transfer-Encoding: 7bitSubject: [example.com] Please Confirm Your E-mail Address From: [email protected]: [email protected]: Wed, 10 Oct 2019 19:29:24 -0000Message-ID: <153626216499.84718.77656477162[email protected]> Hello from example.com!You're receiving this e-mail because user testuser2 has given yours as an\ e-mail address to connect their account.To confirm this is correct, go to http://127.0.0.1:8000/api/v1/rest-auth/\ registration/account-confirm-email/MQ:1fxzy0:4y-f6DqQFZVNB_-PgBI4Iq_M4iM/ Thank you from example.com! example.com


在您的網絡浏覽器中,通過 http://127.0.0.1:8000/admin/ 切換到 Django admin。 您將需要使用您的超級用戶帳戶。


然後,單擊頁面頂部的令牌鏈接。




您將被重定向到位於以下位置的令牌頁面:


http://127.0.0.1:8000/admin/authtoken/token/




Django REST 框架已為 testuser2 用戶生成了一個令牌。 通過 API 創建其他用戶時,其令牌也將顯示在此處。


邏輯上的問題是,為什麼我們的超級用戶帳戶或測試用戶沒有令牌? 答案是我們在添加令牌認證之前創建了這些帳戶。 但是不用擔心,一旦我們通過API使用任一帳戶登錄,令牌就會自動添加並可用。


繼續,讓我們使用我們的新 testuser2 帳戶登錄。 打開 Web 浏覽器,訪問 http://127.0.0.1:8000/api/v1/rest-auth/login/


輸入我們的 testuser2 帳戶的信息。 點擊“ POST”按鈕。




發生了兩件事。 在右上角,我們的用戶帳戶 testuser2 可見,確認我們現在已登錄。服務器還發送了帶有令牌的 HTTP 響應。




在我們的前端框架中,我們需要在本地存儲中或以cookie的形式在客戶端上捕獲並存儲此令牌。 然後配置我們的應用程序,以便所有將來的請求都在標頭中包含令牌,以作為認證用戶的一種方式。

總結

首次使用 Web API 時,用戶身份驗證是最難掌握的領域之一。 沒有整體結構的好處,作為開發人員,我們必須深入了解並適當配置我們的 HTTP 請求/響應周期。


Django REST Framework 對此過程提供了很多內置支持,包括內置 TokenAuthentication。 但是,開發人員必須自己配置其他區域,例如用戶注冊和專用的 url/ 視圖。 因此,一種流行,強大且安全的方法是依靠第三方軟件包 django-rest-auth 和 django-allauth 來最大程度地減少必須從頭開始編寫的代碼量。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved