python | March 24, 2020
Vibe는 기본적으로 Naver의 자회사여서 회원가입 자체가 네이버 회원가입이며, 로그인 또한 네이버를 통하는 방법으로 진행하고 개별 회원가입과 로그인은 따로 없다.
네이버 소셜로그인을 진행하기 위해, 네이버 개발자센터에서 앱 사용 등록을 해야한다.
1) 프론트에서 아이디와 비밀번호를 입력해서(body) 네이버에 요청(request)을 보내면, 네이버에서 네이버 계정이 맞다는 token을 보내준다.
2) 프론트는 네이버에서 받은 token을 request.headers에 담아 백엔드로 전달해준다.
3) 백엔드는 프론트가 보내준 token을 headers에 담아 네이버로 요청을 하고, 네이버는 token을 확인한 후 회원정보를 response한다.
# user/views.py
class NaverSignInView(View):
def get(self, request):
naver_token = request.headers.get('Authorization', None)
header = {'Authorization' : f"Bearer {naver_token}"}
url = "https://openapi.naver.com/v1/nid/me"
try:
response = requests.get(url, headers = header, timeout = 2)
user_data = response.json()['response']
if User.objects.filter(naver_id = user_data.get('id')).exists():
user = User.objects.get(naver_id = user_data.get('id'))
token = jwt.encode({"user_id": user.naver_id}, SECRET_KEY['secret'], algorithm = 'HS256').decode('utf-8')
return JsonResponse({"token": token,
"user" : {"nickname": user.nickname, "image": user.image}}, status = 200)
else:
User(
naver_id = user_data.get('id'),
nickname = user_data.get('nickname'),
name = user_data.get('name'),
email = user_data.get('email'),
image = user_data.get('profile_image'),
birthday = datetime.strptime(user_data.get('birthday'), "%m-%d").date(),
gender = user_data.get('gender'),
).save()
user = User.objects.get(naver_id = user_data['id'])
token = jwt.encode({"user_id": user.naver_id}, SECRET_KEY['secret'], algorithm = 'HS256').decode('utf-8')
return JsonResponse({"token": token,
"user" : {"nickname": user.nickname, "image": user.image}}, status = 200)
except KeyError:
return JsonResponse({"message": "INVALID_KEYS"}, status = 400)
Reference: https://stackabuse.com/the-python-requests-module/