# my_auth.py from django.contrib.auth import get_user_model from .custom_auth import check_if_user # custom Auth성공시 True 아니면 False
UserModel = get_user_model()
classUserBackend(object): defauthenticate(self, username=None, password=None): if check_if_user(username, password): # OO커뮤니티 사이트 인증에 성공한 경우 try: # 유저가 있는 경우 user = UserModel.objects.get(username=username) except UserModel.DoesNotExist: # 유저 정보가 없지만 인증 통과시 user 생성 user = UserModel(username=username) user.is_staff = False user.is_superuser = False user.save() # 여기서는 user.password를 저장하는 의미가 없음.(장고가 관리 못함) return user else: # OO 커뮤니티 사이트 인증에 실패한 경우, Django기본 User로 감안해 password검증 try: user = UserModel.objects.get(username=username) if user.check_password(password) and self.user_can_authenticate(user): return user except: returnNone
defuser_can_authenticate(self, user): is_active = getattr(user, 'is_active', None) # 유저가 활성화 되었는지 return is_active or is_active isNone# 유저가 없는 경우 is_active는 None이므로 True
장고에서 기본적으로 관리해주는 AUTHENTICATION_BACKENDS에는 django.contrib.auth.backends.ModelBackend가 있다. 하지만 위에서 우리가 만든 UserBackend를 추가해줘야 한다.
AUTHENTICATION_BACKENDS는 기본적으로 list로 구성되어있으며, 적혀진 순서대로 위에서부터 Auth을 진행한다.(실패시 다음 auth backend를 이용)
아래 코드와 같이 settings.py 파일 아래에 추가해 주자.
1 2 3 4 5
# settings.py AUTHENTICATION_BACKENDS = [ 'my_user.my_auth.UserBackend', # 우리가 만든 AUTH를 먼저 검사 'django.contrib.auth.backends.ModelBackend', # Django가 관리하는 AUTH ]
이렇게 추가해 줌으로서 django는 우리의 UserBackend를 이용해 유저를 관리하게 된다.
마무리 코드
widgets:
custom_auth 파일(진짜 OO커뮤니티 유저인가?)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# custom_auth.py import requests
defcheck_if_user(user_id, user_pw): payload = { 'user_id': str(user_id), 'user_pw': str(user_pw) } with requests.Session() as s: s.post('https://community-dummy.com/login', data=payload) auth = s.get('https://community-dummy.com/login_requited_page') if auth.status_code == 200: # 성공적으로 가져올 때 returnTrue else: # 로그인이 실패시 returnFalse
# my_auth.py from django.contrib.auth import get_user_model from .custom_auth import check_if_user # custom Auth성공시 True 아니면 False
UserModel = get_user_model()
classUserBackend(object): defauthenticate(self, username=None, password=None): if check_if_user(username, password): # OO커뮤니티 사이트 인증에 성공한 경우 try: # 유저가 있는 경우 user = UserModel.objects.get(username=username) except UserModel.DoesNotExist: # 유저 정보가 없지만 인증 통과시 user 생성 user = UserModel(username=username) user.is_staff = False user.is_superuser = False user.save() # 여기서는 user.password를 저장하는 의미가 없음.(장고가 관리 못함) return user else: # OO 커뮤니티 사이트 인증에 실패한 경우, Django기본 User로 감안해 password검증 try: user = UserModel.objects.get(username=username) if user.check_password(password) and self.user_can_authenticate(user): return user except: returnNone
defuser_can_authenticate(self, user): is_active = getattr(user, 'is_active', None) # 유저가 활성화 되었는지 return is_active or is_active isNone# 유저가 없는 경우 is_active는 None이므로 True
# settings.py AUTHENTICATION_BACKENDS = [ 'my_user.my_auth.UserBackend', # 우리가 만든 AUTH를 먼저 검사 'django.contrib.auth.backends.ModelBackend', # Django가 관리하는 AUTH ]