2012-10-22 9 views
9

Facebook(「fbuser」と言う)またはGoogle(googleuser)を使用してユーザーを作成した後。通常のdjango管理者(normaluser)から別のユーザを作成して、3人目のユーザ(normaluser)がログインしているときにFacebookやGoogleを使って再度ログインしようとすると、AuthAlreadyAssociatedというエラー例外がスローされます。Django Social AuthのAuthAlreadyAssociated例外

  1. 理想的には、すでに ユーザーnormaluserとしてログインしていると呼ばれるエラーをスローする必要があります。

  2. 普通のユーザーをログアウトして、 のように、既にFBまたはGoogleに関連付けられている アカウントに関連付けてください。

上記2つの機能のどちらを実装すればよいですか?すべてのアドバイスは大歓迎です

私はSOCIAL_AUTH_PIPELINEをカスタマイズしようとすると、また、FBやGoogleでログインすることはできません、そしてそれは、ログインURL /アカウント/ログインを強制的に/

答えて

9

DSAは、アカウント(またはフラッシュセッション)をログアウトしないで瞬間AuthAlreadyAssociatedは、現在のユーザーが使用しようとしている現在のソーシャルアカウントに関連付けられていないシナリオを強調表示します。あなたのプロジェクトを、スイートかもしれないカップルのソリューションがあります。

  1. social_auth.middleware.SocialAuthExceptionMiddlewareのサブクラスを定義し、あなたが好む方法で好きな警告をリダイレクトするか、設定するデフォルトの動作(process_exception())をオーバーライドします。

  2. 例外を発生させる代わりに、現在のユーザーをログアウトするパイプライン方法を置き換えます(social_auth.backend.pipeline.social.social_auth_userを置き換えます)。

+0

オプション#2を実行しようとしましたが成功しませんでした。ユーザーをログアウトさせるが、新しいsocial.userとしてログインすることはできない。 置換: 'この{0}アカウントが既に使用中である'。 MSG =をフォーマット(プロバイダ) 上昇AuthAlreadyAssociated(strategy.backend、MSG) 有する: ログアウト(kwargs.get( '要求')) user = social.user – nwilson5

+0

@omab:Djangoを使用したPythonの社会的な認証では、同じリクエストでシームレスに現在のユーザーをログアウトし、social_userパイプライン置換を使用して2番目のユーザーのセッションを設定する方法はありますか? – jacob

+0

@omab:social.actions.do_completeでは、is_authenticatedは既存のユーザー(「ユーザーA」)に基づいて最初に設定されます。しかし、パイプラインで「ユーザーA」をログアウトして「ユーザーB」を返すと、do_completeはis_authenticatedがすでにTrueに設定されているため、「ユーザーB」にログインしません。 「ユーザーB」にログインするかどうかを判断するために、パイプラインが完了した後にdo_completeでセッションユーザーを再度評価する必要がありますか? – jacob

3

この問題への私のアプローチではなく、パイプラインでこれを取り組んで、私は、ユーザーが最初の場所でのパイプラインに渡されていないことを確認しました、少し異なっていました。このようにして、social_auth.userがログインしているユーザーと一致しなくても、social_auth.userは現在ログインしているユーザーの一番上にログインします。

私はそれがcompleteアクションを無効にするのと同じくらい簡単だと思います。

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'ビューが少し変更されたため、これは動作しません(そのまま)。ソースに潜入し、変更に合わせるためにちょっと微調整しなければならなかったが、戦略は堅実で、無条件にNoneを渡すユーザーパラメータをオーバーライドしました。 –

+0

私のための完全な機能の最新の作業(0.3.xバージョン)バージョンhttps://maketips.net/tip/450/fix-authalreadyassociated-at-complete-this-account-is-already-in-use – user3479125

2

下social_userパイプラインをオーバーライドする方法を疑問に思う人々のためのソリューションのpython-社会的-AUTHのバージョン0.2.x

あなたの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', 
) 
あなたのオーバーライド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', 
    '...', 
) 
関連する問題