authenticate()

IOS, Front-End와 회의 중 소셜 로그인 구현 얘기가 나왔다.

실제 “오늘의집” 사이트에서도 소셜 로그인이 가능하고 현재 다른 사이트들에서도

소셜 로그인이 대부분 가능하기 때문에 IOS 분들과 먼저 앱에서 구현을 먼저 하기로 했다.

개인 프로젝트를 진행할 때에는 django 자체에서 서버와 클라이언트를 모두 구현했던 것과는 달리

이번에는 Front분들과 같이 진행해야 했기 때문에 우리 백엔드 팀에서 내가 IOS 한 분과 소셜 로그인에 대한

부분을 맡아서 진행하기로 했다.

검색도 하고 강사님께 질문도 하면서 알아낸 정보는 다음과 같았다.

  • Front 단에서 해당 소셜 계정에 대한 정보를 받아 저장
  • 해당 소셜에서 다른 사이트에서 구분할 수 있는 Unique ID를 부여
  • Django에서 소셜 로그인을 위한 autenticate() 구현

Django REST Framework를 사용하고 있고 서버 자체의 로그인은 Token 인증 방식을 사용했다.

그리고 “오늘의집”이라는 사이트는 아이디를 이메일로 로그인하고 있었기 때문에 이미 autenticate()를 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from django.contrib.auth import get_user_model

User = get_user_model()

# Email Login Authentication
class EmailBackend:
def authenticate(self, request, email, password):
"""

:param request:
:param email: 유저 이메일
:param password: 유저 패스워드
:return: user object
"""
try:
user = User.objects.get(email=email)

except User.DoesNotExist:
return None

# 패스워드 맞는지 검사
if user.check_password(password):
return user

def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None

그래서 소셜 로그인을 위해서 하나 더 만들었다.

그리고 IOS 분과 회의를 해서 소셜 계정에서 넘어오는 정보를 받았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Social Login Authentication
class SocialLoginBackend:
def authenticate(self, request, type, unique_user_id, username, email, social_profile):
"""

:param request:
:param type: 오늘의 집 로그인인지, 소셜로그인인지
:param unique_user_id: 클라이언트가 보내준 Unique ID
:param username: 클라이언트가 보내준 유저 정보 중 username
:param email: 클라이언트가 보내준 유저 정보 중 email
:param social_profile: 클라이언트가 보내준 유저 정보 중 profile image
:return: User object
"""
# 추가정보 필요없이 유저를 생성하면 되는 경우
user, user_created = User.objects.update_or_create(
type=type,
unique_user_id=unique_user_id,
defaults={
'username': username,
'email': email,
'social_profile': social_profile,
},
)
return user

def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None

소셜 로그인의 가장 큰 장점은 가입 절차없이 로그인이 되는 것이기 때문에 update_or_create()를 사용했다.

그리고 기존 유저 모델을 확장해서 소셜 로그인에 대한 정보도 받을 수 있도록 필드를 추가했다.

그리고 settings.py에 다음과 같이 등록했다.

1
2
3
4
5
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'accounts.backends.EmailBackend',
'accounts.backends.SocialLoginBackend',
]

그리고 Token 인증 방식을 사용하고 있었기 때문에 소셜 로그인에 대한 serializers와 views를 따로 구현했다.

기존의 Token 관련 seriaizers와 views를 가져와서 바꿨다.

authenticate에 대해서 django 문서에서도 잘 나와있어서 조금 더 찾아봐야 겠다.

Share