반응형
카카오 로그인 api를 이용해서 로그인을 구현하는데
코드나 토큰을 가지고 카카오에 정보를 요청해야 한다.
그동안은 요청을 받고 응답을 보내주는 것만 해봐서 요청을 보내는 법을 알아봤는데 requests라는 라이브러리를 사용하면 된다.
카카오 토큰 발급받기
인가코드를 이용하지 않아도 아래 페이지로 들어가면 토큰을 받을 수 있다.
https://developers.kakao.com/tool/rest-api/open/get/v1-user-access_token_info
카카오 토큰을 가지고 카카오 유저정보 요청하는법
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#req-user-info-sample
requests 라이브러리 설치하기
pip install requests
사용하기
import requests # import하고 사용
...
access_token = request.headers.get('Authorization', None)
# 프론트에서 준 카카오 토큰을 헤더스에서 뽑아낸다
headers = {
'Authorization':f'Bearer {access_token}'
} # 카카오에서 알려준 형태대로 headers를 만든다
response = requests.get('https://kapi.kakao.com/v2/user/me', headers = headers)
# 보내는 요청의 종류를 requests.뒤에 붙인다. post는 requests.post
# requests는 해당 요청의 응답을 반환한다.
data = response.json()
# .json()은 json객체를 딕셔너리로 반환시켜준다
# data에 아래 카카오 응답예시 딕셔너리가 담긴다.
kakao_id = data['id']
name = data['kakao_account']['profile']['nickname']
email = data['kakao_account'].get('email')
#이메일은 필수 동의사항이 아니어서 사용자가 정보제공 동의를 하지 않으면 값이 오지 않는다.
#그래서 딕셔너리의 .get을 이용해서 email이 없으면 None이 email에 반환되도록 한다.
# 그리고 kakao_id와 우리 데이터베이스에 담긴 유저들의 kakao_id를 비교해서 없으면 회원가입을 하고 바로 우리 서버의 토큰을 발급해준다.
if not User.objects.filter(kakao_id=kakao_id).exists():
User.objects.create(name=name, email=email, kakao_id=kakao_id)
user = User.objects.get(kakao_id=kakao_id)
token = jwt.encode({'id':user.id}, settings.SECRET_KEY, settings.ALGORITHM)
return JsonResponse({'message': 'SUCCESS', 'token': token, 'name': user.name}, status=200)
>>카카오 응답예시
더보기
HTTP/1.1 200 OK
{
"id":123456789,
"kakao_account": {
"profile_needs_agreement": false,
"profile": {
"nickname": "홍길동",
"thumbnail_image_url": "http://yyy.kakao.com/.../img_110x110.jpg",
"profile_image_url": "http://yyy.kakao.com/dn/.../img_640x640.jpg",
"is_default_image":false
},
"name_needs_agreement":false,
"name":"홍길동",
"email_needs_agreement":false,
"is_email_valid": true,
"is_email_verified": true,
"email": "sample@sample.com",
"age_range_needs_agreement":false,
"age_range":"20~29",
"birthday_needs_agreement":false,
"birthday":"1130",
"gender_needs_agreement":false,
"gender":"female"
},
"properties":{
"${CUSTOM_PROPERTY_KEY}": "${CUSTOM_PROPERTY_VALUE}",
...
}
}
참고
https://data-jj.tistory.com/53
반응형
'wecode' 카테고리의 다른 글
마이허니트립 | 예약상태 지정에 Enum사용하기 (0) | 2022.08.07 |
---|---|
마이허니트립 | 카카오 로그인 api : 카카오 인가코드로 토큰발급받기 (0) | 2022.08.05 |
마이허니트립 | 데이터베이스 모델링 (0) | 2022.08.04 |
구방문방구 | 프로젝트 회고 (1) | 2022.08.01 |
구방문방구 | orm최적화(MainPageView, ProductListView) (0) | 2022.07.31 |