1

我使用過去4-5個月的django,最近開始學習django-rest-framework,我對正確的認證系統感到困惑, 其實我試圖建立一個大多使用REST API的應用程序,因爲我的 客戶端可以同時瀏覽器和Android, 所以我需要一個身份驗證系統,用戶可以在其中使用內置身份驗證(django.contrib.auth.model.User)以及第三方社交身份驗證(Google,Facebook,等等..)。如何在我的應用程序中實現內置的django認證和第三方社交認證?

現在,我很困惑我該如何創建我的數據庫,因爲當我創建 表/模型可以說一個'書',那麼這個模型需要一個外鍵給用戶模型和這裏用戶可以是'django.contrib.auth.model.User'和用戶使用第三方認證註冊,

那麼我如何引用用戶在外鍵我的模型領域?

我也決定自定義django的內置身份驗證,因爲我想用 用戶使用他們的電子郵件而不是用戶名登錄。

class Book(models.Model): 
    title = models.CharField(...) 
    author = models.ForeignKey(?) ? Here, how do i refer to both 
           'django.contrib...User' and users signed-up      
           using thrid-party auth. 

回答

0

讓我詳細說明你的問題。首先:你很幸運。你的問題有一個(幾乎)開箱即用的版本。

爲社會和正常驗證和登記,包括電子郵件驗證等,你可以依靠的Django allauth:

https://github.com/pennersr/django-allauth

Django的restauth提供建立在allauth頂一個寧靜的平臺,所以你甚至不用從頭開始建立你的權威性REST API:

https://github.com/Tivix/django-rest-auth

當涉及到你的DB模式,有幾個選項。你可以繼續建立自己的認證系統,在我看來,這是過分的。 更重要的是,我將實現一個配置文件模型,該配置文件與django.contrib.auth.models.User中的用戶模型具有OneToOne關係,如Django文檔的this chapter中所述。

你的模型(當然在分離應用程序)是這樣的:

from django.contrib.auth.models import User 
from django.db import models 
#other imports 

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='profile') 
    books_read = models.IntegerField(default=0) 
    books_recommended = models.IntegerField(default=0) 

class Book(models.Model): 
    title = models.CharField(...) 
    author = models.ForeignKey('UserProfile', related_name='books') 

你會遇到的另一個問題是如何更新和/或顯示在您的序列化的嵌套關係。

This FAQ article來自django-restauth文檔和this chapter的官方django-rest_framework文檔將幫助您快速啓動。

最佳, d

+0

感謝丹尼斯,但我感到困惑的是什麼,我會在用戶配置的「用戶」字段存儲(根據您的答案),當用戶註冊他們的社會身份驗證的自我。 – Deepak

+0

您將從django.contrib.auth.models存儲對auth用戶模型的引用!把它看作是一個問題的分離。所有auth部分都由djangos用戶完成,用戶配置文件不會處理額外的信息! Django的所有身份驗證都將處理您的所有社交登錄/常規登錄,並將其鏈接到身份驗證模型。包括令牌處理:) –

+0

好吧,all-auth甚至可以處理我的正常身份驗證,我不知道這一點,這就是爲什麼我很困惑......我想我必須處理我自己的身份驗證與第三方身份驗證分開系統。 – Deepak