Django - facebook login 함수 기능별 나누기
09 Jul 2018 | django패스트캠퍼스 웹 프로그래밍 수업을 듣고 중요한 내용을 정리했습니다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
Facebook Login
- code를 가지고 access_token을 받아오는 함수
- access_token을 debug하는 함수
- user에 관한 정보를 가져오는 함수
- 이 정보들을 통해 로그인/가입하는 함수
def facebook_login(request):
def get_access_token(code):
"""
Authorization code를 사용해 액세스 토큰을 받아옴
:param code: 유저의 페이스북 인증 후 전달되는 Authorization code
:return: 액세스 토큰 문자열
"""
# GET parameter의 'code'에 값이 전달됨(authentication code)
# 전달받은 인증코드를 사용해서 액세스 토큰을 받음
url = 'https://graph.facebook.com/v3.0/oauth/access_token'
params = {
'client_id': settings.FACEBOOK_APP_ID,
'redirect_uri': 'http://localhost:8000/members/facebook-login/',
'client_secret': settings.FACEBOOK_APP_SECRET_CODE,
'code': code,
}
response = requests.get(url, params)
# 파이썬에 내장된 json모듈을 사용해서, JSON형식의 텍스트를 파이선 Object로 변환
# response_dict = json.loads(response.text)
response_dict = response.json()
access_token = response_dict['access_token']
return access_token
def debug_token(token):
"""
주어진 token을 Facebook의 debug_token API Endpoint를 사용해 검사
:param token: 액세스 토큰
:return: JSON응답을 파싱한 파이썬 Object
"""
# 액세스 토큰을 debug
# 결과에서 해당 토큰의 user_id(사용자 고유값)을 가져올 수 있다.
url = "https://graph.facebook.com/debug_token"
params = {
'input_token': token,
'access_token': '{}|{}'.format(
settings.FACEBOOK_APP_ID,
settings.FACEBOOK_APP_SECRET_CODE,
)
}
response = requests.get(url, params)
return response.json()
def get_user_info(token, fields=None):
# 동적으로 params의 'fields'값을 채울수 있도록 매개변수 및 함수 내 동작 변경
# get_user_info('<token_value>') <- 기존의 5가지 값을 fields로
# get_user_info('<token_value', ['id','name','first_name']) <- 주어진 3개만
"""
주어진 token에 해당하는 Facebook User의 정보를 리턴
'id,name,first_name,last_name,picture'
:param token: Facebook User토큰
:param fields: join()을 사용해 문자열을 만들 sequence 객체
:return: JSON응답을 파싱한 파이썬 Object
"""
# GraphAPI의 'me'를 이용해서 Facebook User정보 받아오기
url = 'https://graph.facebook.com/v3.0/me'
params = {
'fields' : ','.join([
'id',
'name',
'first_name',
'last_name',
'picture',
])
# 'fields': 'id,name,first_name,last_name,picture',
'access_token': token,
}
response = requests.get(url, params)
return response.json()
def create_user_from_faebook_user_info(user_info):
"""
Facebook GraphAPI의 'User'에 해당하는 응답인 user_info로부터
id, first_name, last_name, picture항목을 사용해서
Django의 User를 가져오거나 없는 경우 새로 만듬(get_or_create)
:param user_info: Facebook GraphAPI - User의 응답
:return: get_or_create의 결과 tuple (User instance, Bool(created))
"""
# 받아온 정보 중 회원가입에 필요한 요소들 꺼내기
facebook_user_id = user_info['id']
facebook_name = user_info['name']
last_name = user_info['last_name']
url_img_prifile = user_info['picture']['data']['url']
# facebook_user_id가 username인 User를 기준으로 가져오거나 새로 생성
return user, user_created = User.objects.get_or_create(
username=facebook_user_id,
default={
'first_name': first_name,
'last_name': last_name,
}
)
code = request.GET['code']
access_token = get_access_token(code)
user_info = get_user_info(access_token)
user, user_created = create_user_from_faebook_user_info(user_info)
# 생성한 유저로 로그인
login(request, user)
return redirect('index')