5SOO_O 의 개발 공부 일지

[all-auth] Django 카카오 로그인 구현하기 본문

Django

[all-auth] Django 카카오 로그인 구현하기

5soo_o 2022. 2. 22. 09:29

1. all auth 설치하기

pip install django-allauth

 

 

 

2. settings.py 수정하기

INSTALLED_APPS = [

    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.kakao',

]
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
]

 

 

 

 

3. project 폴더의 urls.py 수정하기

 

회원가입을 담당하는 앱 이름이 common이라 다음과 같이 추가해 주었다.

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

 

 

 

 

4. migrate하기

python manage.py migrate

 

 

 

 

5. admin 페이지 설정하기

 

소셜 계정 게시판이 추가되었다.

소셜 어플리케이션으로 들어간 다음, 

 

우측 상단의 소셜 어플리케이션 추가 누르기

 

 

 

 

 

 

6. kakao developers 사이트로 가서 클라이언트 아이디 받아오기

 

애플리케이션을 추가한 다음 키를 발급받는다.

로그인에 쓰일 키는 REST API키 이다.

 

 

 

 

 

 

7. 클라이언트 아이디에 REST API키 입력하기. 카카오 로그인은 비밀키가 없어서 none으로 해줘도 된다.

 

 

 

 

 

8. kakao developers 사이트에 redirect uri 등록해주기

로그인 선택한 다음(/common/login/), 사용자가 로그인 페이지에서 카카오 로그인을 선택 하면

카카오 서버에서  인증 정보를 전달해준다. 카카오 서버에서 정보를 전달받을 url을 지정해주어야 한다.

 

 

 

 

 

9. 동의 항목 설정하기

 

 

 

 

 

 

10. views.py 작성하기.

client_id 에는 본인의 REST API키를 입력하면 된다.

작성자의 회원 모델은 django에서 기본으로 제공하는 user모델, user모델과 OneToOneField를 맺고있는 Customer모델 두개가 있어 둘 다 생성하는 코드로 작성해주었다.

카카오 로그인 시 이미 db에 있는 유저라면 회원가입 하지 않고 바로 로그인 해주어야 하는데,  

이를 아래 if not user ~ else 문으로 처리해주었다.

 

소셜 로그인과 일반 로그인은 다른 인증 백엔드를 가지기 때문에

일반 로그인과 소셜 로그인 둘 다 인증 백엔드를 명시해주어야 한다.

 

- 일반 회원가입

login(request, user, backend='django.contrib.auth.backends.ModelBackend')

- 소셜 로그인

login(request, user, backend='allauth.account.auth_backends.AuthenticationBackend')

 

 

def kakao_login(request):
    try:
        client_id = ""
        redirect_uri = "http://127.0.0.1:8010/common/kakaologin/callback/"
        return redirect(f"https://kauth.kakao.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code")

    except Exception as error:
        messages.error("로그인 로직 에러발생", request, error)
        return redirect('/')




def kakao_login_callback(request):
    code = request.GET.get("code")
    if code is None:
        print("코드를 받을 수 없습니다")
    client_id = ""
    redirect_uri = "http://127.0.0.1:8010/common/kakaologin/callback/"
    request_access_token = requests.post(f'https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id={client_id}&redirect_uri={redirect_uri}&code={code}', headers={"Accept": "application/json"})
    access_token_result = request_access_token.json()

    access_token = access_token_result.get('access_token')
    headers = {"Authorization" : f"Bearer {access_token}"}
    profile_request = requests.post("https://kapi.kakao.com/v2/user/me", headers=headers,)
    profile_json = profile_request.json()
    kakao_account = profile_json.get('kakao_account')

    profile = kakao_account.get('profile')
    username = profile.get('nickname')
    email = kakao_account.get("email")

    user = User.objects.filter(email=email).first()

    if not user:
        user = User.objects.create_user(
            email=email,
            username=username
        )
        user.set_unusable_password()
        user.save()

        customer = Customer()
        customer.user = user
        customer.name = username
        customer.email = email
        customer.save()

        login(request, user, backend='allauth.account.auth_backends.AuthenticationBackend')

    else:
        login(request, user, backend='allauth.account.auth_backends.AuthenticationBackend')

    return redirect('/')

 

728x90

'Django' 카테고리의 다른 글

2022 06 20  (0) 2022.06.20
장고로 쇼핑몰을 만들어보면서 만난 에러 정리  (0) 2022.02.14
[ForeignKey] on_delete 종류  (0) 2022.01.15
[Django] Generic View  (0) 2022.01.06
[Django] 장고의 구조  (0) 2021.12.05