-
[Django] Google 계정으로 로그인하기 (로컬 서버 + 실제 서버)Web/Django 2020. 8. 5. 22:15
예전에도 시도를 해봤었는데 도메인 이름없이 하기가 어려워서 포기했었는데
최근에는 일단 localhost에서는 google 계정으로 로그인하기 성공했다.
그리고 서버에서는 아무래도 IP 주소만으로는 어렵고 아무래도 도메인 이름이 필요한데
돈을 주고 사면 더 좋지만 일단은 연습해보는 것이기 때문에 freenom에서 제공하는 무료 도메인을 사용해보았다.
Django-allauth 설치 및 설정
Google 로그인을 가능하게 하려면 기본적인 설치와 설정부터 시작해야 한다.
Django-allauth를 사용하면 된다. 사용하려면 아래의 명령어로 사용하는 서버에 설치한다.
pip3 install django-allauth
다음 settings.py에 가서 아래와 같은 작업을 해야한다.
#settings.py # Specify the context processors as follows: TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ ... 'django.template.context_processors.request', <- 추가해주기 ! ... ], }, }, ] AUTHENTICATION_BACKENDS = [ ... 'django.contrib.auth.backends.ModelBackend', 'allauth.account.auth_backends.AuthenticationBackend', ... ] INSTALLED_APPS = [ ... # 없으면 추가해주기 'django.contrib.auth', 'django.contrib.messages', 'django.contrib.sites', ... 'allauth', 'allauth.account', 'allauth.socialaccount', 'allauth.socialaccount.providers.google', ... ] SITE_ID = 1 #일단은 1이라고 해두었지만 바꿔야 할 수도 있다 (아래에서 더 적겠음) SOCIALACCOUNT_PROVIDERS = { 'google': { 'SCOPE': [ 'profile', 'email', #저는 email 주소 정보도 받아오고 싶어서 추가해줬습니다 ], 'AUTH_PARAMS': { 'access_type': 'online' } } }
그리고 project/urls.py 에 가서 allauth에 관한 url path를 추가해준다.
urlpatterns = [ ... path('accounts/', include('allauth.urls')), ... ]
일단 이정도 설정을 해주고
python3 manage.py makemigrations python3 manage.py migrate python3 manage.py runserver
Migration을 시켜주고 서버를 돌리면
이런 페이지가 성공적으로 뜬다. 하지만 로그인하려고 Google 버튼을 눌러주면 아래와 같은 에러가 뜬다.
이것은 social applications가 등록되어있지 않기 때문이다.
서버의 admin page ( http://127.0.0.1:8000/admin )에 가서 social applications를 추가해야 한다.
추가 버튼을 누르면 아래와 같은 페이지가 뜨는데 우리는 google 로그인을 할 것이기 때문에 provider를 Google로 하고 name은 아무렇게나 지정해줘도 된다. Sites는 현재 localhost:8000이기 때문에 localhost:8000을 chosen sites에 넘겨준다. 만약에 존재하지 않는다면 + 버튼을 눌러서 추가해주면 된다.
이제 client id와 secret key 부분만 남았다. 이 정보들을 어디에서 가져올 수 있는지 이제 적어보겠다.
Google OAuth 설정 (localhost)
도메인주소가 있다면 google cloud console에 가서 API & Services - OAuth consent screen에 가서 바로 추가할 수 있지만 도메인 주소가 없다면 아래의 항목에서 한계에 부딫힐 것이다.
검색을 많이 해본 결과 도메인 주소가 없으면 아래의 방법으로 해볼 수 있다. 일단 아래의 주소로 가보자.
https://developers.google.com/gmail/api/quickstart/python
가면 위와 같은 내용이 있는데 Enable the Gmail API 버튼을 누르면 된다. 그러면 항목 선택을 할 수 있는 창이 있는데 본인은 web server로 선택했다.
그리고 Google Cloud Platform (https://console.cloud.google.com)에서 API 및 서비스 - 사용자 인증 정보에 가면 아래처럼 OAuth 2.0 클라이언트 ID가 생성되어 있을 것이다.
저기서 생성된 OAuth client를 클릭하면 아래와 같은 내용들이 뜰 것인데 승인된 자바스크립트 출처에 사용할 서버 주소, 즉 현재는 http://localhost:8000 을 추가해준다. 또한 승인된 리디렉션 URI에는 http://127.0.0.1:8000/accounts/google/login/callback/ 을 입력해주면 된다.
같은 페이지의 오른쪽에 보면 클라이언트 ID와 클라이언트 보안 비밀이 적혀 있는데 이 값들을 아까 django의 admin page에서 social application을 추가할 때 client ID 와 secret key에 집어넣어주면 된다.
구글 클라우드에서 OAuth 클라이언트 설정을 저장하고 django admin에서 social application을 추가하고 나면 이제 거의 완료되었다. 다시 http://127.0.0.1:8000/accounts/login/ 에 가서 google 로그인을 클리해서 구글 로그인 페이지가 뜨는 경우도 있고 아닌 경우도 있다. 안뜨는 경우에는 django의 DB의 django_site 테이블에서 localhost:8000의 ID가 몇번인지 기억해보고 settings.py에 가서 해당 ID로 바꿔주면 된다. 본인의 경우에는 아래처럼 ID가 3이기 때문에 settings.py에서 SITE_ID를 3으로 바꿔주었다.
이제 구글 로그인을 하면 아래처럼 Google 계정으로 로그인하기가 뜨고 성공적으로 구글 계정으로 로그인할 수 있다.
Google OAuth 설정(domain name)
지금까지 성공했다면 domain 이름이 있을 때에 그 서버에서도 구글 로그인이 될 수 있게 하기는 간단하다.
아까 생성했던 Google Cloud Platform - API 및 서비스 - 사용자인증번호에서 OAuth 2.0 클라이언트에 가서 사용하려는 서버의 주소를 아래의 example.com처럼 더해주고
밑에서 "사용할 주소"/accounts/google/login/callback 을 입력하면 된다. 아래의 그림에서는 예제로 http://example.com/accounts/google/login/callback 이라고 입력했다.
'Web > Django' 카테고리의 다른 글
[Django] webhook을 사용하여 잔디(JANDI)에 알림 보내기 (0) 2020.08.18 [Django] Python 3.5에서 Python 3.7로 업그레이드 하기(mod_wsgi업그레이드) (Ubuntu) (0) 2020.08.09 [Django] Django와 MySQL 연동하기 (0) 2020.07.09 [Django] Ubuntu에서 Django + Apache2 연결하기 (0) 2020.07.07 [Django] MacOS 장고 개발환경 설정 (2) 2020.06.24