django

[django] 소셜로그인(카카오)

support_u 2023. 5. 2. 03:05

1. 라이브러리 설치

pip install django-allauth

 

2. settings.py 설정

INSTALLED_APPS = [

    'django.contrib.sites',
    
    # allauth
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    
    # providers(카카오가 아니어도, 네이버, 구글, 페이스북 가능)
    'allauth.socialaccount.providers.kakao',    
]


AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',

    'allauth.account.auth_backends.AuthenticationBackend',
)

SITE_ID = 1

LOGIN_REDIRECT_URL = '/'  # 로그인 후 리다이렉트 될 경로
ACCOUNT_LOGOUT_REDIRECT_URL = reverse_lazy('accountapp:login')

 

3. urls.py 수정

앱을 별도로 만들 필요는 없다.

    path('accounts/', include('accounts.urls')),
    path('accounts/', include('allauth.urls')),

4. kakao developers 사이트 접속

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

5. 애플리케이션 추가 후  Redirect URL 등록하러가기 클릭 

 

6. 원하는 플랫폼에 사이트 도메인 등록

 

7. 활성화 설정 on & redirect URL 설정(중요)

나는 http://127.0.0.1:8000/accounts/kakao/login/callback/로 설정하였음.

8. 동의항목에서 받아올 값 설정

 

9. superuser로 admin사이트에 들어가서 sties에서 아래처럼 자신의 url로 사이트 변경을 해준다.

python manage.py createsuperuser

10.  소셜계정 - 소셜어플리케이션 추가에서 아래와 같이 설정

카카오는 비밀키가 따로 없으니 아무거나 입력

site는 위 설정한 사이트 하나만 넣어주면 됨

11. templates에 링크를 걸어준다

{% load socialaccount %}

<a href="{% provider_login_url 'kakao' method='oauth2' %}">
카카오톡 회원가입
</a>

+ views.py의 login에서 자동로그인을 한 경우 인증수단이 많이지면 오류 발생

 
아래 오류 발생
You have multiple authentication backends configured and therefore must provide the `backend` argument or set the `backend` attribute on the user.

사용자 인증 백엔드를 정해줄 필요가 있다.

def signup(request):
    if request.user.is_authenticated:
        return redirect('posts:index')
    if request.method == 'POST':
      form = CustomUserUserCreationForm(request.POST)
      if form.is_valid():
          user = form.save()
          # 백엔드 지정구문 추가
          user.backend = 'django.contrib.auth.backends.ModelBackend'
          auth_login(request, user)
          return redirect('posts:index')
    else:
        form = CustomUserUserCreationForm()
    return render(request, 'accounts/signup.html', {'form':form})