2015-03-06 22 views
7

Tôi có mô hình người dùng tùy chỉnh và tôi đang sử dụng django-allauth để đăng ký và đăng nhập xã hội. Tôi đang cố kết nối người dùng hiện tại với tài khoản xã hội mới khi người dùng đăng nhập bằng tài khoản xã hội đã đăng ký sử dụng email. Tôi đã tìm thấy số này link.tài khoản xã hội django-allauth kết nối với tài khoản hiện có khi đăng nhập

def pre_social_login(self, request, sociallogin): 
    user = sociallogin.account.user 
    if user.id: 
     return 
    try: 
     customer = Customer.objects.get(email=user.email) 
    except Customer.DoesNotExist: 
     pass 
    else: 
     perform_login(request, customer, 'none') 

Nhưng tôi gặp lỗi khi cố gắng đăng nhập thông qua tài khoản xã hội.

RelatedObjectDoesNotExist at /accounts/facebook/login/callback/ 
SocialAccount has no user. 

Bất kỳ trợ giúp sẽ được đánh giá cao.

Ngoài ra, tôi biết vấn đề bảo mật trong vấn đề này. Nhưng tôi vẫn muốn thử điều này.

+0

Bạn đã đọc phần nói về những mô hình người dùng tuỳ chỉnh và django-allauth? http://django-allauth.readthedocs.org/en/latest/advanced.html#custom-user-models – petkostas

Trả lời

15

Tôi đã quản lý để làm việc này bằng cách thay đổi mã cho bộ điều hợp một chút.

adapter.py

from allauth.socialaccount.adapter import DefaultSocialAccountAdapter 

class MySocialAccountAdapter(DefaultSocialAccountAdapter): 
    def pre_social_login(self, request, sociallogin): 
     user = sociallogin.user 
     if user.id: 
      return   
     try: 
      customer = Customer.objects.get(email=user.email) # if user exists, connect the account to the existing account and login 
      sociallogin.state['process'] = 'connect'     
      perform_login(request, customer, 'none') 
     except Customer.DoesNotExist: 
      pass 

Nếu subclassing DefaultSocialAccountAdapter, chúng ta phải xác định SOCIALACCOUNT_ADAPTER = 'myapp.my_adapter.MySocialAccountAdapter' trong settings.py tập tin

+0

Lớp khách hàng ở đâu ?? –

+1

Lớp khách hàng chỉ là một ví dụ. Tôi tạo ra một mô hình người dùng tùy chỉnh với AbstractBaseUser của django. – anupsabraham

+1

OK..Bạn cũng có thể giải thích cho dù bạn đã thực hiện thay đổi này trong mã allauth hay bạn đã tạo một lớp riêng biệt? –

0

Tôi tìm thấy giải pháp sau here đó cũng kiểm tra rằng các địa chỉ email được xác minh.

from allauth.account.models import EmailAddress 

def pre_social_login(self, request, sociallogin): 

     # social account already exists, so this is just a login 
     if sociallogin.is_existing: 
      return 

     # some social logins don't have an email address 
     if not sociallogin.email_addresses: 
      return 

     # find the first verified email that we get from this sociallogin 
     verified_email = None 
     for email in sociallogin.email_addresses: 
      if email.verified: 
       verified_email = email 
       break 

     # no verified emails found, nothing more to do 
     if not verified_email: 
      return 

     # check if given email address already exists as a verified email on 
     # an existing user's account 
     try: 
      existing_email = EmailAddress.objects.get(email__iexact=email.email, verified=True) 
     except EmailAddress.DoesNotExist: 
      return 

     # if it does, connect this new social login to the existing user 
     sociallogin.connect(request, existing_email.user) 

nếu bạn muốn bỏ qua bước xác minh, tôi nghĩ rằng giải pháp này vẫn còn tốt hơn một chút:

def pre_social_login(self, request, sociallogin): 

    user = sociallogin.user 
    if user.id: 
     return 
    if not user.email: 
     return 

    try: 
     user = User.objects.get(email=user.email) # if user exists, connect the account to the existing account and login 
     sociallogin.connect(request, user) 
    except User.DoesNotExist: 
     pass 
Các vấn đề liên quan