개발새발

django 소셜 로그인 OAuth2 본문

카테고리 없음

django 소셜 로그인 OAuth2

정성원 2024. 9. 19. 04:10

요즘 웹 페이지 중에 소셜 로그인을 하지않는 곳이 없다

그렇다 나도 할꺼다 그 방법을 하나하나 알아가 보려 한다


우선 소셜로그인 구현하는 방법을 찾아보니 많지만 적었다 

여러 방법이 있지만 최종 하나로 모인다는 뜻이다 

소셜 로그인을 하려면 OAuth2 인증을 통해야 하는데 

이걸 도와주는 장고 패키지 들이 있다 

그중에서 가장 널리 사용되는 것은

"django-allauth" 와 "dj-rest-auth"의 조합입니다

그 이유는 다음과 같다

1. django-allauth

  • 다양한 소셜 플랫폼 지원: 구글, 페이스북, 트위터, 깃허브 등 여러 소셜 로그인 제공자와의 통합을 지원합니다.
  • 확장성: 이메일 인증, 비밀번호 관리 등 추가적인 인증 기능을 쉽게 확장할 수 있습니다.
  • 쉬운 설정: 각종 소셜 인증 관련 설정과 흐름이 간단하게 구성되어 있어, 초기 설정이 비교적 쉽습니다.

2. dj-rest-auth

  • Django REST Framework와의 통합: django-allauth와 함께 사용할 수 있으며, REST API를 통해 소셜 로그인을 처리할 수 있습니다.
  • JWT 지원: 토큰 기반 인증(JWT)과의 통합이 쉬워 모바일 및 프론트엔드 애플리케이션과 연동하는 데 유리합니다.
  • 소셜 로그인 핸들링: OAuth2 인증을 통해 소셜 로그인을 처리하는 API 엔드포인트를 쉽게 만들 수 있습니다.

"자! 이제 구현해보자 "

 

1. 패키지 설치

pip install django-allauth dj-rest-auth

pip install oauthlib requests requests-oauthlib    << 소셜 로그인을 위해서 OAuth 라이브러리 설치

 

2. INSTALLED_APPS 설정( google예시 이다  )

소셜 로그인 제공자는 allauth.socialaccount.providers.google처럼 추가할 수 있다. 여기서는 구글을 예시로 들었지만,

페이스북, 깃허브 등도 추가할 수 있다. 제공자마다 관련된 앱을 추가해야 한다

 

3. SITE_ID 설정

settings.py에 SITE_ID를 설정한다:

django.contrib.sites 를 사용하는 django-allauth 에서는 SITE_ID 설정이 필수다

SITE_ID는 Django의 django.contrib.sites 프레임워크에서 사용하는 설정으로, 하나의 Django 프로젝트에서

여러 사이트를 다루거나 지원할 수 있도록 하는 기능이다

django-allauth는 로그인, 회원가입, 소셜 로그인 등과 관련된 동작을 할 때, 어떤 사이트에서 동작하고 있는지 알아야 한다.

이를 위해서 SITE_ID를 사용해 현재 프로젝트의 사이트를 구분한다

곧 SITE_ID 는 사이트가 생성되는 순서 이고 1번이 우리가 사용하는 사이트 이다 만약 사이트를 여러개 운영하면서

세팅은 2번째에 두고 싶으면 2라고 하면 되겠지만 대부분 1일것 같다

 

4. 소셜 로그인 설정

각 소셜 로그인 제공자에 대한 API 키, 비밀 키 등을 설정해야 한다.

이 외에 페이스북이나 깃허브 등도 비슷한 방식으로 추가할 수 있다

이 설정을 통해 특정 소셜 제공자의 인증 범위, 인증 방식을 지정할 수 있다

"google" 구글 로그인을 위한 설정

"scope" 요청할 범위 (프로필과 이메일)

"auth_params" 인증시 필요한 추가 파라미터 (인증타입 ,= 온라인에서 진행하겠다 )

"oauth_pkce_enabled" OAuth 2.0 인증 과정에서 보안 강화 활성화 True 

 

5. URL 설정

urls.py에 dj-rest-auth와 관련된 URL들을 설정합니다. 기본 인증 및 소셜 로그인을 처리할 수 있도록 해준다

기존에 토큰 방식의 회원가입 및 로그인은 그대로 유지했고 소셜은 추가 해주었다 
그러면 프론트에서 두가지 방법 다 사용할수 있게 할수 있다 

6. REST Framework 및 인증 설정

JWT를 사용할 경우 settings.py에 아래와 같이 설정해 준다

내경우엔 이미 JWT 사용중이라 이 설정 은 과거에 해주었다

JWT 토큰 설정을 위해 SIMPLE_JWT를 추가한다

  •  REST_USE_JWT = True는 dj_rest_auth 라이브러리 가JWT을 사용 인증한다는 설정이다

 - 기본적으로 dj_rest_auth는 세션 기반 인증을 사용하지만, 이 설정을 True로 변경하면 JWT 기반 인증을 사용하게 된다

  • JWT_AUTH_COOKIE = 'my-app-auth' 이거는 토큰을 쿠키에 저장하도록 하는거다 

- 기본적으로 JWT는 HTTP 헤더에 담아 전달되지만, 이 설정을 통해 JWT를 쿠키에 저장할 수 있다

쿠키에 저장할 때는 보안에 특히 주의해야 하며,

보통 HTTP Only 쿠키로 설정해 XSS(크로스 사이트 스크립팅) 공격을 방지한다 

 

  • 쿠키에 저장하는 이유: 브라우저에서 HTTP 헤더에 토큰을 명시적으로 추가하지 않고도 요청을 자동으로 인증할 수 있게 해준다.
    이를 통해 브라우저의 쿠키 관리 기능을 이용해 편리하게 인증을 유지할 수 있다.

7. OAuth 클라이언트 등록

구글이나 페이스북 같은 소셜 제공자에서 OAuth 클라이언트를 등록해야 한다.
그 후에 제공되는 클라이언트 ID비밀 키를 django-allauth에서 사용하도록 설정한다.
구글 OAuth 예시로는 다음과 같이 설정할 수 있어요:

클라이언트 아이디와 시크릿키는 다음과 같은 방법으로 받을수 있다 

Google Cloud Console 로그인 

프로젝트생성
사용자인증정보 만들기
OAuth 클라이언드 ID
앱 이름 리다이렉션 주소
이렇게 받을수 있다

 

8. 테스트

서버를 실행해보니 오류가 났다 당연히 예감하고있었다

1번째 오류 

django.core.exceptions.ImproperlyConfigured: allauth.account.middleware.
AccountMiddleware must be added to settings.MIDDLEWARE

-이 오류는 django-allauth를 사용할 때 필수로 추가해야 하는 미들웨어가 설정되지 않아서 발생한 문제라고 한다 allauth.account.middleware.AccountMiddleware를 settings.py 파일의 MIDDLEWARE 설정에 추가하여 해결

왜 필요한가?

  • AccountMiddleware는 django-allauth의 계정 관련 기능을 사용할 때 필수다.
    이 미들웨어는 사용자 세션을 관리하고, 소셜 로그인 및 기타 인증 관련 요청을 처리하는 데 필요하다.
  • 특히, 소셜 로그인, 이메일 확인, 사용자 상태를 유지하는 과정에서 이 미들웨어가 필요하다.

2번째 오류

ModuleNotFoundError: No module named 'cryptography'
pip install cryptography

-이 오류는 cryptography 패키지가 설치되지 않았기 때문에 발생한 것이다.
이 패키지는 보안 관련 기능(암호화, 서명 등)을 제공하며,
Django에서 JWT 인증이나 다른 보안 기능을 구현할 때도 사용 한다고 한다.

pip install cryptography < 설치해서 오류해결

 

자 대망의 테스트다

??????????????????????????

url 을 잘못 작성했단다 아닌데...

똑바로 넣었단 말이다....

트러블 슈팅 (4일 동안 했다..추석 내내 소셜로그인과 함께 )

그리고 반쪽 짜리 성공만 했다 그렇기때문에 아래내용은 다음 을 위해 적는 것이다

(대충 쓴다는 이야기)

문제점 및 해결

  • 로그인후 리다이렉트 이동 페이지 를 찾을수 없다
    - 리다이랙트 올바른 경로 를 추가해줄수있다 (callback, localhost)
    - 로컬호스트 이동은 후 404는 아직 인덱스 파일을 만들지 않았기 때문에 나오는게 맞다
    로그인후 리다이렉트는 잘 되었다는 소리다
  •  로그인후 기존 로그인 방식 과 인증 과정이 서로 맞지 않았다 (토큰)
    - 소셜로그인시 주어지는 토큰이 있고 우리가 api 구축할때 만들었던 인증 절차나 로그인시
    사용하는 토큰이 달랐다 연결해주어야 한다 (성공하지 못했다)
  • 로그인후 사용자 이름이 user 로만 저장 되는것 을 확인
    - 데이터 베이스에 소셜 로그인 이 저장은 되는데 user 로 저장이 되었다 
    내가 커스텀한 유저 모델과 맞지 않아서였고 맞쳐주니 내 이름이 나오는것을 확인했다
  • 네이버 로그인이 되지 않았다 
    - 구글 로그인후 네이버 로그인을 시도해보았다 비슷했고 똑같이 했는데 로그인 되지않고 
    거부되었다 
  • 다음에 이어서 해결해야 하는 문제들
    - 인증 절차 맞추기 , 다른 소셜 로그인 성공하기 

추석내내 정말 날 힘들게 했지만 그래서 정말 100번은 디렉토리 지우며 한거같다 애증에 소셜이다

아직 반쪽 짜리 성공이니 완벽한 성공하면 다시 돌아와서 뭐가 문제였는지 확인하고 수정 하겠다