2017-11-29 17 views
1

내 웹 응용 프로그램에 django-allauth을 사용하여 소셜 로그인 (provider-google)을 구현했습니다. 응용 프로그램에 제한된 도메인 만 허용하려고합니다. 다음은 내가 'abc.com'도메인과 계정 만 허용 할 수 있어요 'HD'매개 변수를 사용하여 allauthDjango allauth 소셜 로그인 (Google OAuth 2) - 도메인 목록 제한

settings.py

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', 
    'allauth.account.auth_backends.AuthenticationBackend', 
) 
SOCIALACCOUNT_ADAPTER = 'mbaweb.socialaccount_adapter.NoNewUsersAccountAdapter' 

LOGIN_REDIRECT_URL = "/" 

SOCIALACCOUNT_PROVIDERS = { 
    'google': { 
     'SCOPE': [ 
      'profile', 
      'email', 
     ], 
     'AUTH_PARAMS': { 
      'access_type': 'online', 
      'hd': 'abc.com' 
     } 
    } 
} 

에 대한 내 설정이다. 다른 모든 도메인 계정을 제한합니다.

하지만 내 요구 사항은 응용 프로그램, 예를 들어

에 도메인 목록을 허용하는 것입니다 : -이를 수있는 방법이 allowed_domains = ['abc.com', 'xyz.co.in', 'pqr.com']

있습니까?

도움 주셔서 감사합니다.

+0

settings.py – Satendra

+0

Google의 모든 인증 구성에서 'ALLOWED_HOSTS = ['abc.com ','def.com ', ...]'을 사용할 수 있습니다. http : //django-allauth.readthedocs .io/ko/latest/providers.html # google 'AUTH_PARAMS'에서'hd' 키를 ​​제거하면 문제가 해결 될 것으로 생각합니다. –

+0

hd를 제거하면 모든 도메인이 응용 프로그램에 허용됩니다. –

답변

0

내가 사용하는 접근 방식은 특정 조건에서 is_open_for_signup에 대해 false를 반환하는 사용자 정의 SocialAccountAdapter을 작성하는 것입니다.

설정에서이 추가

SOCIALACCOUNT_ADAPTER = 'myapp.auth.adapters.SocialAccountAdapter' 

을 분명히 코드에 맞게 경로 myapp.auth을 변경합니다. 해당 adapters.py 파일에서

이 같은 것을 추가

from allauth.socialaccount.adapter import DefaultSocialAccountAdapter 


def email_domain(email): 
    """Extracts the domain from an email address. 

    Warning: this is simplified and you may want a true email address parser. 
    """ 
    return email.split('@')[-1] 


# Note: this would be better in settings.py 
allowed_signup_domains = [ 
    'abc.com', 
    'seconddomain.com', 
    'etcetc.com', 
] 


class SocialAccountAdapter(DefaultSocialAccountAdapter): 

    def is_open_for_signup(self, request, sociallogin): 
     if email_domain(sociallogin.user.email) not in allowed_signup_domains: 
      return False 
     return super(SocialAccountAdapter, self).is_open_for_signup(request, sociallogin) 

접근 방식은 완벽하지 않지만 작업을 수행하고 사용자에게 다소 "우아한"실패를 제공합니다.

+0

지금 동일한 방법을 사용하고 있습니다. 오류 메시지가 표시되지만 사용은 계정에 로그인됩니다. 사용자가 로그인 할 때 다른 계정을 사용하려면 수동으로 이미 로그인 한 계정으로 이동하여 로그 아웃해야합니다. 그런 다음 다른 계정으로 로그인하십시오. 또한 일단 오류 메시지가 나타나면 url은 oauth2 콜백 URL이됩니다. 사용자가 페이지를 새로 고침하면 더 혼란 스러울 수 있습니다. –

+0

사용자가 잘못된 계정에 로그인하기 전에이를 제어하려고합니다. –

+0

필자는 다시 테스트 한 결과, is_open_for_signup() 메소드가 False를 반환하면 사용자가 로그인하지 않았고 해당 사용자의 _no_ 계정이 생성되었음을 확인했습니다. 콜백 URL에서 중지하고 해당 페이지를 다시로드하면 "소셜 네트워크 오류"라고 표시됩니다. 완벽하지는 않지만 기능적이고 명확합니다. –