페이스북의 로그인으로 user 생성과 로그인을 대신할 수 있다
facebook login process라고 검색, 이미지로 이해하자
developers.facebook.com 을 참고
facebook login 문서와 그래픽 API를 사용한다.
login.html파일에서 시작해 views.py로 이어진다.
urls.py
path('facebook-login/', views.facebook_login, name='facebook-login'),
login.html
<div>
<!--페이스북 로그인 페이지로 보냄, 클라이언트 id와 리다이렉트 uri를 포함-->
<!--페이스북 다이얼로그로 auth요청을 보내는 과정이다.-->
<!--클라이언트 아이디는 내 앱으로 부터 요청을 보내는 것을 의미 -->
<!--리다이렉트는 로그인 후 돌아오는 페이지, request에 code를 받아서 돌아온다-->
<!--code는 view함수에서 진행됨 -->
<a href="https://www.facebook.com/v3.0/dialog/oauth?
client_id=631395940565915
&redirect_uri=http://localhost:8000/members/facebook-login/&scope=email,public_profile" class="btn btn-primary">페이스북 로그인</a>
</div>
views.py
def facebook_login(request):
# 템플릿에서 첫번째 과정을 거친 후 request에서 code 전달됨(authentication code)
# 전달받은 인증 코드를 사용해서 access token 을 얻음
code = request.GET.get('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,
}
# access code를 받기위해 다시 요청을 보냄
# 클라이언트 아이디, 리다이렉트 uri에 덧붙여
# 시크릿 코드와 전달받은 인증 코드를 params에 덧붙여 보낸다
response = requests.get(url, params)
# 제이슨은 텍스트로 전달된 엑세스 토큰을 딕트 형태로 변환 시켜주는 파이선 모듈이다
# 제이슨을 통해서 토큰을 변수에 할당
response_dict = json.loads(response.text)
response_dict = response.json()
access_token = response_dict['access_token']
# 얻은 토큰을 통해 해당 사용자 고유의 user_id를 받을 수 있다
# 얻은 토큰을 디버그 해주는 과정
url = 'https://graph.facebook.com/debug_token'
params = {
'input_token': access_token,
'access_token': f'{settings.FACEBOOK_APP_ID}|{settings.FACEBOOK_APP_SECRET_CODE}',
}
# response에는 기본적인 유져 프로필과 같은 사항이 담기게 된다
response = requests.get(url, params)
# 그래픽api를 통해서 추가적으로 필요한 정보를 탐색해본 후 얻어온다
# 여기서부터는 그래픽 api 사용법 문서를 참고해서 진행함
# email과 같이 그래픽에서 얻어오지 못한 것은 주소창의 스코프를 이용한다??
url = 'https://graph.facebook.com/v3.0/me'
params = {
'access_token': access_token,
'fields': ','.join([
'id',
'name',
'first_name',
'last_name',
'picture',
])
}
# 필드의 정보를 담은 응답을 얻는다
response = requests.get(url, params)
response_dict = response.json()
facebook_user_id = response_dict['id']
first_name = response_dict['first_name']
last_name = response_dict['last_name']
url_img_profile = response_dict['picture']['data']['url']
# 받은 정보를 get_or_create를 이용해 새로 유져를 생성한다
# 여기서 - if문을 사용하지 않고 작성
# - default값으로 지정해주는 방법:
# get 에는 username만 사용되고 defaults로
# 지정된 값들은 create 할 때 사용된다
user, user_created = User.objects.get_or_create(
username=facebook_user_id,
defaults={
'first_name': first_name,
'last_name': last_name,
},
)
login(request, user)
return redirect('index')
'Django' 카테고리의 다른 글
Brunch Feed 프로젝트 후기 (0) | 2019.06.14 |
---|---|
Django 에서 메일전송하기(DRF 예시 코드) (0) | 2019.06.13 |