[python] Django REST framework에서의 소셜 미디어 로그인 처리 방법

Django REST framework은 소셜 미디어 로그인을 간편하게 처리할 수 있는 기능을 제공합니다. 소셜 미디어 로그인은 사용자가 자신의 소셜 미디어 계정을 사용하여 애플리케이션에 로그인할 수 있는 기능을 의미합니다. 이를 구현하기 위해서는 몇 가지 단계를 따라야 합니다.

설정

먼저, Django 프로젝트에 필요한 패키지들을 설치해야 합니다. 다음 명령어를 통해 필요한 패키지를 설치할 수 있습니다:

pip install social-auth-app-django

설치가 완료되면 settings.py 파일에 아래와 같이 소셜 미디어 로그인 관련 설정을 추가해야 합니다:

INSTALLED_APPS = [
    ...
    'social_django',
    ...
]

AUTHENTICATION_BACKENDS = [
    ...
    'social_core.backends.google.GoogleOAuth2',
    'social_core.backends.facebook.FacebookOAuth2',
    ...
]

SOCIAL_AUTH_FACEBOOK_KEY = 'YOUR_FACEBOOK_APP_KEY'
SOCIAL_AUTH_FACEBOOK_SECRET = 'YOUR_FACEBOOK_APP_SECRET'

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = 'YOUR_GOOGLE_APP_KEY'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 'YOUR_GOOGLE_APP_SECRET'

위 설정에서 YOUR_FACEBOOK_APP_KEYYOUR_FACEBOOK_APP_SECRET 부분을 자신의 Facebook 앱의 키와 시크릿으로 대체해야 합니다. 마찬가지로 YOUR_GOOGLE_APP_KEYYOUR_GOOGLE_APP_SECRET 부분을 자신의 Google 앱의 키와 시크릿으로 대체해야 합니다.

URL 설정

소셜 미디어 로그인 기능을 사용하기 위해서는 URL 라우팅을 설정해야 합니다. urls.py 파일에 아래와 같이 URL을 추가해야 합니다:

from django.urls import path, include
from rest_framework_social_oauth2 import urls

urlpatterns = [
    ...
    path('api-auth/', include('rest_framework.urls')),
    path('auth/', include('social_django.urls', namespace='social')),
    path('auth/', include('rest_framework_social_oauth2.urls')),
    ...
]

API 엔드포인트

RESTful API에 소셜 미디어 로그인 기능을 추가하려면, views.py 파일에 아래와 같이 소셜 미디어 로그인을 처리하는 뷰를 추가해야 합니다:

from social_django.utils import load_backend, load_strategy

from oauth2_provider.models import AccessToken
from oauth2_provider.settings import oauth2_settings

class SocialLoginView(APIView):
    permission_classes = (permissions.AllowAny,)

    def post(self, request):
        strategy = load_strategy(request)
        backend = load_backend(strategy, 'facebook', '/auth/token/')

        try:
            access_token = self.request.data.get('access_token')
            token = AccessToken.objects.get(token=access_token)
        except AccessToken.DoesNotExist:
            return Response({'error': 'Invalid access token'}, status=400)

        if token.is_expired():
            token.delete()
            return Response({'error': 'Token expired'}, status=403)

        user = backend.do_auth(token)

        if user:
            return Response({'token': user.auth_token.key})
        else:
            return Response({'error': 'Failed to authenticate'}, status=400)

위의 코드는 Facebook을 예시로 사용한 것이며, Google 등 다른 소셜 미디어 로그인 방법도 동일한 방식으로 구현할 수 있습니다.

이제 소셜 미디어 로그인 기능을 사용할 수 있는 RESTful API가 준비되었습니다.

참고 자료