2013-08-27 83 views
1

在客戶端,我使用Facebook SDK的iOS SDK進行登錄,並獲取Facebook ID和訪問令牌。Django的自定義用戶模型和Facebook登錄

現在,在Django方面,我想創建一個用戶,使用Facebook ID作爲主標識符和其他字段,如訪問令牌,名字,姓氏等(我將從Graph中檢索的最後兩個字段服務器端的API)。

我知道我必須創建一個自定義用戶模型。

如果您希望存儲與用戶有關的信息,則可以使用包含字段的模型的一對一關係獲取更多信息。這種一對一模式通常稱爲配置文件模型,因爲它可能存儲有關站點用戶的非auth相關信息。

這還不夠,因爲我將使用Facebook ID和訪問令牌進行身份驗證。

這給我留下了兩個選項:我可以替換一個自定義的用戶模型,像這樣:

AUTH_USER_MODEL = 'myapp.MyUser' 

或者,我可以繼承AbstractUser:

如果你完全滿意Django的用戶模型而您只想在 中添加一些額外的配置文件信息,您可以簡單地將 django.contrib.auth.models.AbstractUser分類並添加您的自定義配置文件 字段。

但這聽起來不太正確。另外這個設計提示讓我更加困惑。

型號的設計考慮 處理不直接相關的認證您的自定義用戶Model.It可能是更好的存儲應用程序特定的用戶信息在與用戶模式的關係的模型信息之前,應仔細考慮。

實施我想要做什麼的最佳方法是什麼?

回答

1

請注意:自定義用戶的問題在於,其他應用程序(以及是的,您將使用它們)通常不會與其正確交互,因爲它們在基礎上進行了假設驗證模型。

這還不夠,因爲我將使用Facebook ID和訪問令牌進行身份驗證。

我不確定你是否真的需要一個自定義用戶。例如,我使用open id進行身份驗證,並且在使用默認用戶時沒有問題:只有另一個與默認用戶具有OneToOne關係的模型。

對於Facebook身份驗證(以及一般身份驗證),您應該擁有的主要關注點是擁有一個具有自己的特定Facebook身份驗證的自定義身份驗證後端。

在內部,authenticate()會遍歷所有安裝的後端(settings.AUTHENTICATION_BACKENDS),並嘗試使用其中一個後端進行身份驗證。

您可以搜索一些現有的實現,例如在Django packages for facebook authentication

+0

我的印象是使用OneToOne關係只會有助於如果附加字段只是額外的信息,而不是驗證所需的字段。我查看了自定義身份驗證後端,但我首先想知道如何設置我的用戶模型。 – geekchic

+0

是的,我的答案是,Facebook身份驗證應該是一個額外的身份驗證。考慮一下你正在離線測試你的網站的情況(沒有網頁)。您無法進行身份驗證以進行測試。 –

+0

額外驗證?那麼在我的情況下,最小認證是什麼? – geekchic

0

如果您的用戶應該能夠使用用戶名,郵件和密碼登錄/註冊 - >使用與django的用戶模型的OneToOne關係來存儲Facebook的憑據。

如果您的用戶模型完全依賴於Facebook數據,並且您不希望用戶使用用戶名/密碼登錄 - >用AUTH_USER_MODEL = 'myapp.MyUser'替換用戶模型。

您可能還想看看django-allauth,它可以解決您的一個小問題。

+0

我不會要求密碼或用戶名,因爲用戶將通過Facebook登錄。那麼你會建議一個'AUTH_USER_MODEL'? – geekchic