개인 프로젝트 중에 소셜로그인기능을 구현하고자 링크와 장점을 찾아 적어봄
- Python Social Auth:
- GitHub 링크: https://github.com/python-social-auth/social-app-django
- 이 라이브러리는 다양한 소셜 인증 방식을 지원하며 Django와 잘 통합됩니다. Python Social Auth는 다양한 OAuth 제공 업체를 지원합니다. Google, Facebook, Twitter, Kakao 등과 같은 서비스를 통해 인증을 처리하려는 경우 이 라이브러리를 사용할 수 있습니다.
- Django Allauth:
- GitHub 링크: https://github.com/pennersr/django-allauth
- 이 라이브러리는 간단하게 다양한 소셜 로그인을 구현할 수 있게 해주며, 많은 개발자들이 사용하고 있습니다. Django Allauth는 내장 로그인 시스템과 함께 사용되며, 이를 통해 사용자는 다양한 소셜 계정을 연결하고 관리할 수 있습니다.
- DRF Social OAuth2:
- GitHub 링크: https://github.com/RealmTeam/django-rest-framework-social-oauth2
- DRF Social OAuth2는 DRF와 함께 사용하기 위해 설계된 라이브러리입니다. 이 라이브러리는 Python Social Auth와 Django OAuth Toolkit를 기반으로 하며, 토큰 기반의 소셜 인증을 쉽게 처리할 수 있습니다.
- 직접 구현: 소셜 인증 과정은 일반적으로 OAuth2 또는 OpenID Connect를 사용하므로 이를 직접 구현하는 것도 가능합니다. 이 방식은 소셜 인증에 대한 더 깊은 이해를 제공하며, 더 세밀한 제어가 가능하지만, 구현 및 유지보수의 어려움이 따릅니다.
커뮤니티에서 가장 많이 사용하는 사용자 수가 많고, 오늘을 기점으로 한달 정도 개발이 꾸준히 되고있음에 'Django Allauth'을선택함
Django Allauth의 특징 중 하나는 OAuth 인증을 지원하고 있지만, 세션 기반 인증이다.
- 세션 기반 : 사용자가 로그인하면 서버 측에서 세션 ID를 발급하고, 이후의 사용자 요청은 이 세션 ID를 통해 인증이 이루어짐
→ 프로젝트는 토큰 기반 인증을 사용하고자 했는데, DRF의 JWT 기반인증을 사용하여 토큰 기반의 인증시스템 구현이 가능한걸로 확인됨.
진행방식으로
- Allauth 로그인을 통해 소셜 계정 인증을 진행
- 인증에 성공
- DRF의 토큰 인증 시스템을 이용하여 사용자에게 토큰을 발급
- 인증에 실패
- 예외처리
이렇게 하면, 소셜 로그인 기능을 지원하는 동시에 RESTful API를 사용하는 클라이언트(예: 모바일 앱, 프론트엔드 SPA 등)가 API 요청을 인증할 수 있도록 가능할 듯 하다.
정말 자세히도 나와있고, 그대로 따라하면 구현이 된다.
막히는 부분이 있다면 아마도 provider dev 홈페이지에서 client_id, secret을 발급받는 거일텐데
네이버 시크릿키 < 이런 키워드로 검색하면 곧장 해답이 나오기도하고, 해당 dev 에 다들 물어봐놔서 검색하면 빠르다.
https://django-allauth.readthedocs.io/en/latest/installation.html
내가 놀란 점은 allauth에서 지원하는 provider가 진짜 어마무시하게 많다는 것이다.
음
따라하다보면 프로젝트 설정에 Provider specific settings 값을 부여하는 구간이 있는데 민감한 부분이니
.env , 혹은 따로 settings.py를 추가, json 파일 본인이 관리를 잘할수 있을거같은 걸 고르면 될거같다.
난 json파일로 설정했다. 읽기 쉬워서..
import json
# json 디렉토리가 manage.py 와 같은 위치라면 'path_to_your_file/' 부분 필요없음.
with open('path_to_your_file/social_auth_settings.json') as json_file:
social_auth_settings = json.load(json_file)
SOCIALACCOUNT_PROVIDERS = {
'google': {'APP': social_auth_settings['google']},
'facebook': {'APP': social_auth_settings['facebook']},
'kakao': {'APP': social_auth_settings['kakao']},
'naver': {'APP': social_auth_settings['naver']},
}
# social_auth_settings.json
{
"google": {
"client_id": "YOUR_GOOGLE_CLIENT_ID",
"secret": "YOUR_GOOGLE_SECRET"
},
"facebook": {
"client_id": "YOUR_FACEBOOK_CLIENT_ID",
"secret": "YOUR_FACEBOOK_SECRET"
},
"kakao": {
"client_id": "YOUR_KAKAO_CLIENT_ID",
"secret": "YOUR_KAKAO_SECRET"
},
"naver": {
"client_id": "YOUR_NAVER_CLIENT_ID",
"secret": "YOUR_NAVER_SECRET"
}
}
진짜.. 진짜.. 로그인 페이지 리다이렉션 되는 것까진 다 됐다.
로그인 성공도 했다.
일단 진행은 다 된다.
대신 내가 원하는 그림이랑은 다르더라.
소셜로그인으로 객체가 생성될 때는 OAuth라는 테이블의 객체로 생성되길 바랬다.
provider: naver,
uid: uadmlkasm129103ejowl,
user_id: user.id,
이런식으로.
그런데.. socialaccount_socialaccount라고 allauth에서 자동으로 만들더라.
관련 테이블이 세개나 더 생김.
내가 계획했던 데이터베이스 구조가 나오질않으니 1차 삔또가 상함.
어떻게 테이블 이름만 다를뿐! 값은 동일하게 들어가는 것이 보이니 진행을 해봄.
아무리 소셜로그인 기능이 있다한들, 베이스는 프로젝트 로그인이다.
JWT 을 이용할 것이었고, 이미 만들어놓은 User 테이블의 필드값과 allauth사용자 정보 필드가 달라 에러가 발생하더라.
필드 옵션값을 수정해서 맞춰주니 진행이 되던데 점점 기획시 고민했던 부분을 라이브러리에 맞추니 2차 삔또가 상함.
로그인, 로그아웃, 자동 회원가입도 시켜줌. 라이브러리여도 디버깅 다 됨.
문젠 예외처리도 해주고싶고 에러 발생시 어떤 에러가 발생하는지 보고싶고 라이브러리 코드에 직접 써야됨.
썼다가 에러 왕창 나가지고 바들바들 거리다가 url도 내가 원하는대로 안나오길래
3차 삔또가 상하자마자 싹 다 지우고 직접 구현을 했다.
그치만 라이브러리가 진짜 좋긴하다. 진짜 좋음. 한동안 버전이슈로 카카오는 안되는거같던데 지금은 됨.
그러니 버전을 잘 보고 해야할듯하다.
그래도 allauth도 경험해보고 직접구현도 해보고 재밌었던 경험이다.
views 파일도 너무 많아져서 이번에 처음 폴더 생성하여 분리해봤는데.. 코드가 더 많아진다면 가독성 너무 좋아질 듯
설계 구조에 대해서 다른 사람들은 어찌 했나 보면 좋을거같다.
'STUDY > Python' 카테고리의 다른 글
Django REST Framework 소셜로그인 (0) | 2023.08.07 |
---|---|
Trailing slash 사용 | URL에 GET parameters를 사용할때는? (0) | 2023.07.31 |
Validate 메서드 작성 = 시리얼라이저? 뷰? (0) | 2023.07.19 |
Exception has occurred: improperlyConfigured (0) | 2023.07.18 |
🎄 학습일지 22.12.11 (0) | 2022.12.12 |