2012-10-22 82 views
9

我使用說Facebook(讓我們說fbuser)或谷歌(谷歌用戶)創建一個用戶。如果我通過普通的django admin(normaluser)創建另一個用戶,並在第三個用戶(normaluser)登錄時使用Facebook或Google再次嘗試登錄,則會引發錯誤異常AuthAlreadyAssociated。在Django社交認證中AuthAlreadyAssociated例外

  1. 理想情況下,應該拋出叫您已經登錄的用戶 的normaluser錯誤。

  2. 或者它應該註銷普通用戶,並嘗試與已經與FB或Google關聯的 帳戶關聯,如 可能的情況。

如何實現上述兩個功能之一?所有建議歡迎。

而且當我嘗試定製SOCIAL_AUTH_PIPELINE,這是不可能的FB或谷歌登錄,並迫使登錄網址/帳號/登錄/

回答

9

DSA不註銷的賬戶(或刷新會話)時刻。 AuthAlreadyAssociated突出顯示當前用戶未與試圖使用的當前社交帳戶關聯的情況。有跡象表明,可能適合你的項目一對夫婦的解決方案:

  1. 定義一個子類的social_auth.middleware.SocialAuthExceptionMiddleware和覆蓋默認行爲(process_exception())重定向或設置在你所喜歡的方式喜歡的警告。

  2. 添加一個管道方法(替代social_auth.backend.pipeline.social.social_auth_user),該方法註銷當前用戶而不是引發異常。

+0

我試着做選項#2但它沒有成功。它成功地將用戶登錄出去,但不會作爲新的social.user登錄。 取代: MSG = '此{0}帳戶已在使用中' 格式(提供商) 提高AuthAlreadyAssociated(strategy.backend,MSG) 用: 註銷(kwargs.get( '請求')) user = social.user – nwilson5

+0

@omab:在使用Django的python社交授權中,我將如何無縫地在同一個請求中註銷當前用戶,並使用social_user管道替換爲第二個用戶設置會話? – jacob

+0

@omab:在social.actions.do_complete中,is_authenticated是在現有用戶(「用戶A」)的基礎上設置的。但是,如果我在管道中註銷「用戶A」並返回「用戶B」,do_complete將不會登錄「用戶B」,因爲它已經被設置爲True。 do_complete在管道完成後再次重新評估會話用戶以確定是否登錄「用戶B」? – jacob

3

我的辦法解決這個問題有點不同,而不是在管道解決這個,我確信,用戶從未傳遞到擺在首位的管道。這樣,即使social_auth.user與登錄用戶不匹配,social_auth.user也會登錄到當前登錄的用戶的頂部。

我認爲這與覆蓋complete行動一樣簡單。人們想知道如何在蟒蛇 - 社會 - 身份驗證版本的0.2.x覆蓋social_user管道

urls.py

url(r'^complete/(?P<backend>[^/]+)/$', 'account.views.complete', name='complete'), 

帳戶/ views.py

from social.actions import do_complete 
from social.apps.django_app.utils import strategy 
from social.apps.django_app.views import _do_login 

@csrf_exempt 
@strategy('social:complete') 
def complete(request, backend, *args, **kwargs): 
    """Override this method so we can force user to be logged out.""" 
    return do_complete(request.social_strategy, _do_login, user=None, 
         redirect_name=REDIRECT_FIELD_NAME, *args, **kwargs) 
+1

隨着時間的推移,我以前的解決方案似乎無法正常工作,或許使用最新的python社交認證。無論如何,你的解決方案確實能正常工作,而且肯定比我的解決方案簡單。我從這個問題刪除了我的。謝謝。 – jacob

+0

這是不工作的(原樣),因爲原來的'complete'視圖略有改變。我必須在源代碼中進行調整並稍微調整以匹配更改,但策略是穩定的,無條件地覆蓋無條件傳遞無的用戶參數。 –

+0

對我來說最新版本的完整功能(0.3.x版)https://maketips.net/tip/450/fix-authalreadyassociated-at-complete-this-account-is-already-in-use – user3479125

2

解決方案

在你的settings.py中:

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details', 
    'social.pipeline.social_auth.social_uid', 
    'social.pipeline.social_auth.auth_allowed', 

    # Path to your overrided method 
    # You can set any other valid path. 
    'myproject.apps.python-social-auth-overrided.pipeline.social_auth.social_user', 
    'social.pipeline.user.get_username', 
    'social.pipeline.user.create_user', 
    'social.pipeline.social_auth.associate_user', 
    'social.pipeline.social_auth.load_extra_data', 
    'social.pipeline.user.user_details', 
) 

在你overrided social_user

from django.contrib.auth import logout 
def social_user(backend, uid, user=None, *args, **kwargs): 
    '''OVERRIDED: It will logout the current user 
    instead of raise an exception ''' 

    provider = backend.name 
    social = backend.strategy.storage.user.get_social_auth(provider, uid) 
    if social: 
     if user and social.user != user: 
      logout(backend.strategy.request) 
      #msg = 'This {0} account is already in use.'.format(provider) 
      #raise AuthAlreadyAssociated(backend, msg) 
     elif not user: 
      user = social.user 
    return {'social': social, 
      'user': user, 
      'is_new': user is None, 
      'new_association': False} 

,如果你願意,你可以刪除註釋行。

+2

你的方法是註銷當前用戶。但它不會登錄新認證的用戶。任何幫助? – rishabsaraf93

0

我得到了同樣的問題。我通過在設置中插入下面的代碼來解決它

AUTHENTICATION_BACKENDS = (
    '...', 
    'social_core.backends.facebook.FacebookOAuth2', 
    '...', 
) 
SOCIAL_AUTH_PIPELINE = (
    '...', 
    'social_core.pipeline.user.user_details', 
    '...', 
)