2013-10-01 5 views
5

Jestem nowicjuszem w Django. Za pomocą django-allauth skonfigurowałem logowanie jednokrotne. Otrzymałem poświadczenia mojej domeny (id_klienta i klucz_prywatny) z konsoli Google api. Ale problem jest django-allauth jest pozwalając mi się zalogować z dowolnego konta google, a ja chcę, adresy e-mail, aby być ograniczone do mojej domeny (@ zamiast example.com @ gmail.com)django-allauth: zezwalaj tylko użytkownikom z określonej domeny Google Apps

django-społeczno-auth ma parametr białych domen na liście, w jaki sposób uwzględnić tę informację w allauth? Zauważyłem, że django-allauth jest łatwiejszy do skonfigurowania po spędzeniu godzin na django-social-auth.

Każda pomoc będzie bardzo cenna.

Odpowiedz

9

Odpowiadając na moje własne pytanie -

To jest rzeczywiście bardzo proste. To, co chcesz zrobić, to zablokowanie logowania po uwierzytelnieniu użytkownika przez dostawcę konta społecznościowego i przed przejściem do jego strony profilu. Można to zrobić z

pre_social_login sposobie DefaultSocialAccountAdapter klasie 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. 

Czy coś

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

To nie jest dokładną implementacją, ale coś takiego działa.

+1

i po utworzeniu niestandardowego adaptera, zarejestruj go za pomocą 'settings.SOCIALACCOUNT_ADAPTER' zgodnie z sekcją konfiguracji w dokumentacji wtyczki. – Matt

+2

dla przyszłego odniesienia Stwierdziłem, że muszę użyć 'u = sociallogin.user' w przeciwnym razie dostanę błąd, jeśli użytkownik wcześniej nie istniał. –

0

Można zrobić coś w celu nadpisania allauth's allauth.socialaccount.forms.SignupForm i sprawdzenia domeny podczas procesu rejestracji. Discalmer: wszystko jest napisane bez testowania, ale coś w tym stylu powinno działać.

# 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 

w adresach URL zastępują allauth domyślne (umieścić to zanim to od 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"), 
    # ... 
) 

nie jestem pewien na "^ społeczne/Zapis/$", sprawdź to.

+0

Prawidłowy adres URL to konta/konta społecznościowe/rejestracja. Ale to nie działa. Nie chcę wyświetlać formularza rejestracyjnego allauth po zalogowaniu się w google. Chcę, aby natychmiast po zalogowaniu google zostały przekierowane na strony profilowe lub pojawił się komunikat o błędzie informujący, że akceptujemy tylko użytkowników z domeny example.com. – aishpant

+0

Czy powinienem używać sygnału pre_social_login django-allauth do dopasowania domeny? – aishpant