2012-10-22 29 views
9

Sau khi tôi tạo một người dùng sử dụng Facebook nói (giả sử fbuser) hoặc Google (googleuser). Nếu tôi tạo một người dùng khác thông qua quản trị django bình thường (normaluser), và thử đăng nhập lại bằng cách sử dụng Facebook hoặc Google trong khi người dùng thứ ba (normaluser) được đăng nhập, nó ném một ngoại lệ lỗi AuthAlreadyAssociated.AuthAlreadyAssociated Exception trong Django Social Auth

  1. Lý tưởng nhất nên gửi một lỗi gọi là bạn đã đăng nhập là người dùng bình thường.

  2. Hoặc nó nên đăng xuất người dùng bình thường và thử liên kết với tài khoản đã được liên kết với FB hoặc Google, như trường hợp có thể.

Làm cách nào để triển khai một trong hai tính năng trên? Mọi lời khuyên đều được chào đón.

Ngoài ra khi tôi cố gắng tùy biến SOCIAL_AUTH_PIPELINE, nó không phải là có thể đăng nhập bằng FB hoặc Google, và nó buộc URL đăng nhập/tài khoản/đăng nhập/

Trả lời

9

DSA không đăng xuất tài khoản (hoặc phiên tuôn ra) tại chốc lát. AuthAlreadyAssociated làm nổi bật trường hợp người dùng hiện tại không được liên kết với tài khoản mạng xã hội hiện tại đang cố gắng sử dụng. Có một vài giải pháp mà có thể phù hợp với dự án của bạn:

  1. Xác định một sub-class của social_auth.middleware.SocialAuthExceptionMiddleware và ghi đè lên hành vi mặc định (process_exception()) để chuyển hướng hoặc thiết lập cảnh báo bạn thích theo cách bạn thích.

  2. Thêm phương thức đường ống (thay thế social_auth.backend.pipeline.social.social_auth_user) để đăng xuất người dùng hiện tại thay vì tăng ngoại lệ.

+0

Tôi đã thử thực hiện tùy chọn # 2 nhưng không thành công. Nó thành công đăng nhập người dùng, nhưng không trở lại như là social.user mới. thay thế:. msg = 'Đây {0} tài khoản đã được sử dụng' định dạng (nhà cung cấp) nâng AuthAlreadyAssociated (strategy.backend, msg) với: logout (kwargs.get ('yêu cầu')) user = social.user – nwilson5

+0

@omab: Trên auth xã hội python sử dụng Django, làm thế nào tôi sẽ liền mạch trong cùng một yêu cầu đăng xuất người dùng hiện tại và thiết lập phiên cho người dùng thứ hai bằng cách sử dụng thay thế đường dẫn social_user? – jacob

+0

@omab: Trong social.actions.do_complete, is_authenticated được đặt ở đầu dựa trên người dùng hiện tại ("người dùng A"). Nhưng nếu tôi đăng xuất "người dùng A" trong đường dẫn và trả về "người dùng B", do_complete sẽ không đăng nhập "người dùng B" vì nó được xác thực đã được đặt Đúng. Nên do_complete đánh giá lại người dùng phiên một lần nữa sau khi hoàn thành đường ống để xác định có đăng nhập "người dùng B" không? – jacob

3

Cách tiếp cận của tôi đối với vấn đề này hơi khác một chút, thay vì giải quyết vấn đề này, tôi đảm bảo rằng người dùng chưa bao giờ được chuyển vào đường ống ngay từ đầu. Bằng cách này, ngay cả khi social_auth.user không khớp với người dùng đã đăng nhập, social_auth.user sẽ được đăng nhập trên đầu người dùng hiện đã đăng nhập.

Tôi nghĩ việc này dễ dàng như việc ghi đè hành động complete.

urls.py

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

tài khoản/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

Một nơi nào đó theo thời gian, giải pháp trước đó của tôi dường như không hoạt động đúng nữa, có lẽ với auth xã hội python mới nhất. Trong mọi trường hợp, giải pháp của bạn hoạt động bình thường và chắc chắn đơn giản hơn tôi. Tôi đã xóa của tôi khỏi câu hỏi này. Cảm ơn. – jacob

+0

Thao tác này không hoạt động (vì nguyên nhân) vì chế độ xem 'hoàn thành' ban đầu đã thay đổi một chút. Tôi đã phải lặn trong nguồn và tinh chỉnh nó một chút để phù hợp với những thay đổi, nhưng chiến lược là vững chắc, ghi đè lên param người dùng vô điều kiện đi qua Không. –

+0

phiên bản làm việc mới nhất (phiên bản 0.3.x) của chức năng hoàn chỉnh cho tôi https://maketips.net/tip/450/fix-authalreadyassociated-at-complete-this-account-is-already-in-use – user3479125

2

Giải pháp cho người tự hỏi làm thế nào để ghi đè lên đường ống social_user dưới python-xã hội-auth phiên bản 0.2.x

Trong settings.py của bạn:

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', 
) 

Trong social_user overrided bạn:

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} 

Bạn có thể xóa dòng nhận xét nếu bạn muốn.

+2

cách tiếp cận là đăng xuất người dùng hiện tại. Nhưng nó không đăng nhập vào người dùng mới được xác thực. Bất kỳ giúp đỡ? – rishabsaraf93

0

Tôi gặp vấn đề tương tự. Tôi đã giải quyết nó bằng cách chèn mã bên dưới vào cài đặt

AUTHENTICATION_BACKENDS = (
    '...', 
    'social_core.backends.facebook.FacebookOAuth2', 
    '...', 
) 
SOCIAL_AUTH_PIPELINE = (
    '...', 
    'social_core.pipeline.user.user_details', 
    '...', 
) 
Các vấn đề liên quan