2013-10-01 18 views
5

Ich bin ein Neuling in Django. Mit django-allauth habe ich ein Single-Click-Login eingerichtet. Ich habe meine Domain-Zugangsdaten (client_id und secret_key) von der Google API-Konsole erhalten. Aber das Problem ist django-allauth ist dass ich von jedem Google-Konto anmelden, während ich die E-Mail-Adressen beschränkt werden möchte meine Domain (@ example.com anstelle von @ gmail.com)django-allauth: Erlaube nur Nutzern einer bestimmten Google Apps-Domain

django-sozial-Auth hat dafür den White Listed Domains Parameter, wie kann ich diese Informationen in allauth einbeziehen? Ich fand django-allauth viel einfacher einzurichten nach stunden auf django-social-auth

Jede Hilfe würde sehr geschätzt werden.

Antwort

9

Beantwortung meiner eigenen Frage-

Das ist eigentlich ziemlich einfach. Was Sie tun möchten, ist die Anmeldung zu blockieren, nachdem ein Benutzer von einem Kontoanbieter authentifiziert wurde und bevor er zu seiner Profilseite weitergehen kann. Sie können mit dem

pre_social_login Methode der DefaultSocialAccountAdapter Klasse in allauth/socialaccount/adaptor.py

Invoked just after a user successfully authenticates via a 
    social provider, but before the login is actually processed 
    (and before the pre_social_login signal is emitted). 
    You can use this hook to intervene, e.g. abort the login by 
    raising an ImmediateHttpResponse 
    Why both an adapter hook and the signal? Intervening in 
    e.g. the flow from within a signal handler is bad -- multiple 
    handlers may be active and are executed in undetermined order. 

Tun Sie dies tun, so etwas wie

from allauth.socialaccount.adaptor import DefaultSocialAccountAdapter 

class MySocialAccount(DefaultSocialAccountAdapter): 
    def pre_social_login(self, request, sociallogin): 
     u = sociallogin.account.user 
     if not u.email.split('@')[1] == "example.com" 
      raise ImmediateHttpResponse(render_to_response('error.html')) 

Dies ist keine exakte Implementierung, aber so etwas funktioniert.

+1

und nach dem Erstellen eines benutzerdefinierten Adapters, registrieren Sie es mit 'settings.SOCIALACCOUNT_ADAPTER' wie im Abschnitt Konfiguration in der Plugin-Dokumentation. – Matt

+2

für zukünftige Referenz Ich fand, ich musste 'u = sociallogin.user verwenden, sonst würde ich einen Fehler erhalten, wenn der Benutzer vorher nicht existierte. –

0

Sie könnten etwas in der Zeile des übergeordneten allauth's allauth.socialaccount.forms.SignupForm tun und die Domäne während des Anmeldevorgangs überprüfen. Discalmer: das ist alles ohne Test geschrieben, aber etwas in der Linie sollte funktionieren.

# settings.py 
# not necesarry, but it would be a smart way to go instead of hardcoding it 
ALLOWED_DOMAIN = 'example.com' 

.

# forms.py 
from django.conf import settings 
from allauth.socialaccount.forms import SignupForm 


class MySignupForm(SignupForm): 

    def clean_email(self): 
     data = self.cleaned_data['email'] 
     if data.split('@')[1].lower() == settings.ALLOWED_DOMAIN: 
      raise forms.ValidationError(_(u'domena!')) 
     return data 

in Ihrem urls allauth Standardwerte überschreiben (diese setzen vor dem gehören der django-allauth)

# urls.py 

from allauth.socialaccount.views import SignupView 
from .forms import MySignupForm 


urlpatterns = patterns('', 
    # ... 
    url(r"^social/signup/$", SignupView.as_view(form_class=MySignupForm), name="account_signup"), 
    # ... 
) 

Ich bin für die "^ sozialen/Anmeldungen/$", überprüfen Sie noch einmal, dass nicht sicher.

+0

Die korrekte URL ist accounts/social/signup. Aber das funktioniert nicht. Ich möchte nach dem Login mit Google kein allauth Anmeldeformular anzeigen. Was ich möchte, ist, dass sie sofort nach Google Login entweder auf ihre Profilseiten geleitet werden oder sie eine Fehlermeldung bekommen, die besagt, dass wir nur Benutzer von der example.com-Domain akzeptieren. – aishpant

+0

Sollte ich Pre_social_login Signal von Django-Allauth zu der Domain-Matching verwenden? – aishpant

Verwandte Themen