2014-06-23 8 views
17

Ben EMAILID ile mevcut kullanıcı yokken Google ve Facebook durumda settings.LOGIN_REDIRECT_URL beklenen yönlendirmeyle birlikte Django (1.6.4) ve allauth (0.16.1) ve Python (2.7) kullanılarak üzerinden giriş başarıyla am güçlü sağlayıcıdan alındı. Zaten sağlayıcısına (fb veya goolge) alınan aynı EMAILID yetkili bir kullanıcı vardır Ancak, her zaman/hesap/sosyal/kayıt/# yönlendirir = kayıt sayfası soruyor: Sendjango allauth facebook, e-posta alındığında mevcut bir kullanıcının e-posta adresiyle eşleştiğinde kaydolmaya yönlendiriyor?

Facebook/Google hesabınızı kullanmak için example.com'a giriş yapın. son adım olarak, lütfen aşağıdaki formu doldurun: E-posta otomatik olarak doldurulur.

SOCIALACCOUNT_AUTO_SIGNUP = True veya False ile test ettim, ancak etki yok. Ben facebook için AUTH_TYPE değiştirmeyi denedim ama dışında herhangi bir seçenek göremiyorum "rerequest"

Aşağıdaki settings.py vardır:

ACCOUNT_AUTHENTICATION_METHOD = "email" # Defaults to username_email 
ACCOUNT_USERNAME_REQUIRED = False  # Defaults to True 
ACCOUNT_EMAIL_REQUIRED = True   # Defaults to False 
SOCIALACCOUNT_QUERY_EMAIL = ACCOUNT_EMAIL_REQUIRED 
SOCIALACCOUNT_AUTO_SIGNUP = True 
SOCIALACCOUNT_EMAIL_REQUIRED = False 
ACCOUNT_ADAPTER = "myproject.adapter.MyLoginAccountAdapter" 
LOGIN_URL = "/" 
LOGIN_REDIRECT_URL = "https://stackoverflow.com/users/{id}/mytags" 

nasıl kaydolmayı bu yönlendirme durdurmak ve sahip olabilir sağlayıcı girişi, aynı e-posta adresine sahip mevcut bir kullanıcının özelliğinde LOGIN_REDIRECT_URL adresine yeniden yönlendiriliyor mu?

NOT: Bu Ben zaten myproject.adapter.MyLoginAccountAdapter içinde get_login_redirect_url güncelledik

GÜNCELLEME çalışmıyor Django allauth - set facebook redirect

  • tarafından alınmamış olarak: Bu answer için

    1. Teşekkür anladım facebook üzerinden giriş, bir durumda kayıt sayfasına yönlendirecektir: facebook profilinden alınan e-posta zaten mevcut kullanıcının e-posta adresiyle eşleştiğinde.
    2. Yukarıdaki durumu açıklamak için soruyu güncelledim.
    3. sorunu özetlemek gerekirse, bu çoklu sağlayıcı hesapları kullanıyorum kez tescil eğer ei facebook, django-allauth sadece facebook kullanmak için bana gerektirecektir (aynı e-posta id ve django-allauth birbirinin giriş izin vermez sahip bir durumdur ve google veya aynı e-posta kimliği ile her şey diğer sağlayıcısı) değil
    4. I (faydalı linkler ile) cevabım bakmak @receiver(pre_social_login) ve raise ImmediateHttpResponse kullanarak bu çözdük: this ve thisone

    sayesinde Amit

  • +0

    Sen kullanıcının benzersiz e-posta adresini istiyorum LOGIN_REDIRECT_URL yönlendirir hangi yükseltir. ? Evet ise, o zaman davranış gerektiren bir şeydir. – vibhor

    +0

    Sadece aynı e-posta kimliğine sahip facebook ve google kullanarak karşılıklı olarak oturum açabilmeyi istiyorum. Soruyu güncelledim. Ben de cevabı buldum. Lütfen bir göz atın. – abarik

    cevap

    13

    Derin google ve kaynak django kodu ve içine kazma sonra çözmüş django-allauth

    Sorun çözüldü ediliyor: Sadece giriş facebook kullanarak ve yönlendirme hep aynı e-posta kimliği ile google ve birbirlerinin yerine yeteneğini istiyorum Başarılı giriş yaptıktan sonra LOGIN_REDIRECT_URL, ancak django-allauth bunu yapmama izin vermiyor. Bunun yerine, istemediğim bir kayıt sayfası sunuyor.

    Çözüm:: Kullanım @receiver(pre_social_login) 1st giriş yapan bir işlevi link_to_local_user() çağırmak ve daha sonra ImmediateHttpResponse sırayla

    #! myproject.adapter.py 
    from allauth.account.adapter import DefaultAccountAdapter 
    from allauth.socialaccount.adapter import DefaultSocialAccountAdapter 
    from allauth.exceptions import ImmediateHttpResponse 
    from allauth.socialaccount.signals import pre_social_login 
    from allauth.account.utils import perform_login 
    from allauth.utils import get_user_model 
    from django.http import HttpResponse 
    from django.dispatch import receiver 
    from django.shortcuts import redirect 
    from django.conf import settings 
    import json 
    
    
    class MyLoginAccountAdapter(DefaultAccountAdapter): 
        ''' 
        Overrides allauth.account.adapter.DefaultAccountAdapter.ajax_response to avoid changing 
        the HTTP status_code to 400 
        ''' 
    
        def get_login_redirect_url(self, request): 
         """ 
         """ 
         if request.user.is_authenticated(): 
          return settings.LOGIN_REDIRECT_URL.format(
           id=request.user.id) 
         else: 
          return "/" 
    
    
    class MySocialAccountAdapter(DefaultSocialAccountAdapter): 
        ''' 
        Overrides allauth.socialaccount.adapter.DefaultSocialAccountAdapter.pre_social_login to 
        perform some actions right after successful login 
        ''' 
        def pre_social_login(self, request, sociallogin): 
         pass # TODOFuture: To perform some actions right after successful login 
    
    @receiver(pre_social_login) 
    def link_to_local_user(sender, request, sociallogin, **kwargs): 
        ''' Login and redirect 
        This is done in order to tackle the situation where user's email retrieved 
        from one provider is different from already existing email in the database 
        (e.g facebook and google both use same email-id). Specifically, this is done to 
        tackle following issues: 
        * https://github.com/pennersr/django-allauth/issues/215 
    
        ''' 
        email_address = sociallogin.account.extra_data['email'] 
        User = get_user_model() 
        users = User.objects.filter(email=email_address) 
        if users: 
         # allauth.account.app_settings.EmailVerificationMethod 
         perform_login(request, users[0], email_verification='optional') 
         raise ImmediateHttpResponse(redirect(settings.LOGIN_REDIRECT_URL.format(id=request.user.id))) 
    
    
    #! settings.py 
    ACCOUNT_AUTHENTICATION_METHOD = "email" # Defaults to username_email 
    ACCOUNT_USERNAME_REQUIRED = False  # Defaults to True 
    ACCOUNT_EMAIL_REQUIRED = True   # Defaults to False 
    SOCIALACCOUNT_QUERY_EMAIL = ACCOUNT_EMAIL_REQUIRED 
    SOCIALACCOUNT_AUTO_SIGNUP = True 
    SOCIALACCOUNT_EMAIL_REQUIRED = False 
    ACCOUNT_ADAPTER = "myproject.adapter.MyLoginAccountAdapter" 
    SOCIALACCOUNT_ADAPTER = 'myproject.adapter.MySocialAccountAdapter' 
    LOGIN_URL = "/" 
    LOGIN_REDIRECT_URL = "https://stackoverflow.com/users/{id}/mytags" 
    
    +0

    belki de 'sonraki' yönlendirme özelliğine saygı duymak istersiniz: 'yükseltmek ImmediateHttpResponse (yönlendirme (sociallogin.get_redirect_url (request))) – sspross

    +0

    @abarik - bu bana çok şey ifade ediyor ve benim kodumdaki yaklaşım. Ancak, kullanıcıyı oturum açmadan ve ImmediateHttpResponse'yi yükseltmeden önce, öncelikle kullanıcının bir social_account ile ilişkilendirilmemiş olduğunu kontrol etmeniz gerekir. Kullanıcı bağlıysa, hiç bir işlem yapılmayacak gibi gözüküyor ve devam etmelerine izin verilmelidir. Benim önerim, kullanıcı oturum açmadan önce user.socialaccount_set.count() == 0' için basit bir denetleme. –

    +2

    Bu yaklaşımla ilgili bir sorun olacak gibi görünüyor, sosyal üzerinden giriş yaptıktan sonra Hesap, sosyal hesap kullanıcı hesabına bağlı olmayacak. – Devang

    İlgili konular