2013-10-01 24 views
5

Tôi là người mới ở Django. Sử dụng django-allauth Tôi đã thiết lập đăng nhập một lần nhấp. Tôi đã nhận được thông tin đăng nhập miền của mình (client_id và secret_key) từ bảng điều khiển google api. Nhưng vấn đề là django-allauth là cho phép tôi đăng nhập từ bất kỳ tài khoản google nào trong khi tôi muốn địa chỉ email bị giới hạn trong miền của mình (@ example.com thay vì @ gmail.com)django-allauth: Chỉ cho phép người dùng từ miền ứng dụng google cụ thể

django-social-auth có thông số tên miền được liệt kê màu trắng cho điều này, làm cách nào để đưa thông tin này vào allauth? Tôi đã tìm thấy django-allauth dễ dàng hơn nhiều để thiết lập sau khi dành hàng giờ trên django-social-auth

Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

Trả lời

9

Trả lời câu hỏi của riêng tôi-

Điều này thực sự khá đơn giản. Những gì bạn muốn làm là ngừng đăng nhập sau khi người dùng đã được nhà cung cấp tài khoản xã hội xác thực và trước khi anh ta có thể tiếp tục đến trang hồ sơ của mình. Bạn có thể làm điều này với

pre_social_login phương pháp của lớp DefaultSocialAccountAdapter trong 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. 

làm cái gì đó như

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

Điều này không phải là một triển khai chính xác nhưng một cái gì đó như thế này hoạt động.

+1

và sau khi tạo bộ điều hợp tùy chỉnh, hãy đăng ký nó bằng 'settings.SOCIALACCOUNT_ADAPTER' theo phần cấu hình trong tài liệu của plugin. – Matt

+2

để tham khảo trong tương lai tôi thấy tôi đã phải sử dụng 'u = sociallogin.user' nếu không tôi sẽ nhận được một lỗi nếu người dùng trước đây không tồn tại. –

0

Bạn có thể làm điều gì đó trong dòng ghi đè allauth.socialaccount.forms allignuthForm của allauth và kiểm tra miền trong quá trình đăng ký. Discalmer: đây là tất cả các văn bản mà không cần thử nghiệm, nhưng một cái gì đó trong dòng đó sẽ làm việc.

# 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 

trong url của bạn ghi đè allauth giá trị mặc định (đặt này trước bao gồm các 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"), 
    # ... 
) 

Tôi không chắc chắn cho "^ xã hội/signup/$", kiểm tra lại đó.

+0

Url chính xác là tài khoản/xã hội/đăng ký. Nhưng điều này không hiệu quả. Tôi không muốn hiển thị biểu mẫu Đăng ký allauth sau khi đăng nhập bằng google. Những gì tôi muốn là ngay sau khi đăng nhập google, hoặc là họ được chuyển đến trang hồ sơ của họ hoặc họ nhận được một messsage lỗi nói rằng, chúng tôi chỉ chấp nhận người dùng từ miền example.com. – aishpant

+0

Tôi có nên sử dụng tín hiệu pre_social_login của django-allauth vào miền phù hợp không? – aishpant

Các vấn đề liên quan