2013-04-14 47 views
4

我正在使用django社交認證(http://django-social-auth.readthedocs.org/en/latest/index.html),並試圖創建一個用戶配置文件,其中用戶可以關聯多個帳戶(如此處在Stackoverflow上)。django社交認證多個帳戶協會

目前我處於單一用戶可以使用不同身份驗證提供程序登錄的時間點,但每次登錄都會創建一個新用戶。我如何將所有用戶帳戶關聯到單個帳戶(如用戶配置文件)?

此外,使用django social-auth時創建用戶個人資料頁面的最佳做法是什麼?

回答

8

DSA已經支持多帳戶關聯,關鍵是它是用戶必須先登錄,否則DSA不知道它應該與已經存在的關聯帳戶。

關於您的個人資料,將功能添加到DSA推薦的方法是通過擴展pipeline,您可以創建這樣一個條目:

def create_profile(user, is_new=False, *args, **kwargs): 
    if is_new: 
     # create a profile instance for the given user 
     create_user_profile(user) 

然後在這樣的設置進行註冊:

SOCIAL_AUTH_PIPELINE = (
    'social_auth.backends.pipeline.social.social_auth_user', 
    'social_auth.backends.pipeline.user.get_username', 
    'social_auth.backends.pipeline.user.create_user', 
    'social_auth.backends.pipeline.social.associate_user', 
    'social_auth.backends.pipeline.social.load_extra_data', 
    'social_auth.backends.pipeline.user.update_user_details', 
    'myapp.pipeline.create_profile' 
) 

其中條目是獲取該功能的導入路徑。

編輯:鏈接到文檔和設置說明。

+0

但爲什麼這增加了管道,而不是使用post_save回調?後者應該工作,而不管哪個認證後端創建用戶。 – knipknap

1

我看到2 alterntive當你想使用多個帳戶的關聯處理:

    1. 找到一個獨特的屬性,所有的身份提供者。
    1. 保持基本身份驗證並將所有其餘身份提供程序鏈接到它。

第一種方法有2個缺點

  • 可能不存在任何attibute存在於所有的身份提供者。 過去人們所做的一個常見的實現方式是使用電子郵件作爲此屬性來標識用戶,但是例如Twitter不再共享該電子郵件。

  • 有可能找到一個不一致的問題。例如,用戶可以爲不同供應商的用戶名或電子郵件設置不同的值。

我建議你實施第二種方法。設置一個主要身份提供者(ldap,數據庫或關閉的身份驗證和安全)。每次用戶希望鏈接「X身份提供商到您的賬戶」時,請查找此提供商使用的屬性,並將其保存在您的主身份和新身份之間的這種關係中。

請注意數據碰撞。爲您的本地帳戶設置數據時,設置提供商會優先選擇什麼,以避免數據錯誤或過期。 (閱讀somethig約「Level of assurance

這是一個古老的辯論,首先實現的東西,開始閱讀。有關於這個issues

相關的各種Django的具體問題,許多有趣的文檔閱讀這個比較 - 該型動物之間djago social-auth apps。還要檢查django-socialprofileold thread

+2

Django的社會身份驗證已經支持多帳戶關聯和它使用的身份驗證提供者以及供應商的名稱(唯一withing應用程序)中給出的標識符。 – omab

+0

ohh,對不起omab,你說得對。太長而不注意這一點。 – smartin

相關問題