16

Facebook(たとえばfbuser)またはGoogle(googleuser)を使用してユーザーを作成した後。通常のdjangoadmin(normaluser)を使用して別のユーザーを作成し、3番目のユーザー(normaluser)がログインしているときに、FacebookまたはGoogleを使用して再度ログインしようとすると、エラー例外AuthAlreadyAssociatedがスローされます。

  1. 理想的には、ユーザーnormaluserとしてすでにログインしているというエラーがスローされるはずです。

  2. または、通常のユーザーからログアウトし、場合によっては、すでにFBまたはGoogleに関連付けられているアカウントに関連付けてみてください。

上記の2つの機能のいずれかを実装するにはどうすればよいですか?すべてのアドバイスを歓迎します。

また、SOCIAL_AUTH_PIPELINEをカスタマイズしようとすると、FBまたはGoogleでログインできず、ログインURL / accounts /login/が強制されます。

4

5 に答える 5

16

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

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

  2. social_auth.backend.pipeline.social.social_auth_user例外を発生させる代わりに、現在のユーザーをログアウトするパイプラインメソッド(置換)を追加します。

于 2012-10-23T14:36:39.430 に答える
5

python-social-authバージョン3以降でsocial_userパイプラインをオーバーライドする方法を疑問に思っている人のためのソリューション

あなたのsettings.pyで:

SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details',
    'social_core.pipeline.social_auth.social_uid',
    'social_core.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_core.pipeline.user.get_username',
    'social_core.pipeline.user.create_user',
    'social_core.pipeline.social_auth.associate_user',
    'social_core.pipeline.social_auth.load_extra_data',
    'social_core.pipeline.user.user_details',
)

オーバーライドされたsocial_user

from django.contrib.auth import logout

def social_user(backend, uid, user=None, *args, **kwargs):
    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)
        elif not user:
            user = social.user
    return {'social': social,
            'user': user,
            'is_new': user is None,
            'new_association': False}

必要に応じて、コメント行を削除できます。

于 2014-12-05T18:09:51.040 に答える
3

この問題に対する私のアプローチは少し異なり、パイプラインでこれに取り組む代わりに、ユーザーが最初からパイプラインに渡されないようにしました。このように、social_auth.userがログインしているユーザーと一致しない場合でも、social_auth.userは現在ログインしているユーザーの上にログインします。

completeアクションをオーバーライドするのと同じくらい簡単だと思います。

urls.py

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

account / 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)
于 2014-08-08T19:33:17.133 に答える
0

同じ問題が発生しました。設定に以下のコードを挿入して解決しました

AUTHENTICATION_BACKENDS = (
    '...',
    'social_core.backends.facebook.FacebookOAuth2',
    '...',
)
SOCIAL_AUTH_PIPELINE = (
    '...',
    'social_core.pipeline.user.user_details',
    '...',
)
于 2017-03-14T13:35:43.613 に答える
0

私がしたことは:

  1. から継承するクラスを定義しますSocialAuthExceptionMiddleware

  2. メソッドを実装しprocess_exception

  3. 実装されたクラスをMIDDLEWAREリストに追加しsettings.pyます。

で、これmiddleware.pyはアプリのディレクトリ、つまりviews.pyアプリに関連付けられたファイルの同じディレクトリにあるはずです。次のクラスを定義します。

from django.shortcuts import redirect
from django.urls import reverse

from social_core.exceptions import AuthAlreadyAssociated

class FacebookAuthAlreadyAssociatedMiddleware(SocialAuthExceptionMiddleware):
    """Redirect users to desired-url when AuthAlreadyAssociated exception occurs."""
    def process_exception(self, request, exception):
        if isinstance(exception, AuthAlreadyAssociated):
            if request.backend.name == "facebook":
                message = "This facebook account is already in use."
                if message in str(exception):
                    # Add logic if required

                    # User is redirected to any url you want
                    # in this case to "app_name:url_name"
                    return redirect(reverse("app_name:url_name"))

settings.py、実装されたクラスをMIDDLEWAREリストに追加します。

MIDDLEWARE = [
    # Some Django middlewares
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.locale.LocaleMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    "social_django.middleware.SocialAuthExceptionMiddleware",

    # the middleware you just implemented
    "app_name.middleware.FacebookAuthAlreadyAssociatedMiddleware",
]

これで問題は解決し、AuthAlreadyAssociated例外が発生したときの制御フローを処理することができました。

于 2018-07-27T21:28:17.240 に答える