Skip to content

26 OAuth 회원가입과 동시에 로그인

YeongBaeeee edited this page May 17, 2017 · 1 revision

OAuth

  • OpenID 로 개발된 표준 인증 방식
  • 각 서비스 별로 제 각각인 인증방식을 표준화한 인증방식
  • 인증을 공유하는 애플리케이션끼리는 별도의 인증이 필요없음.

다양한 장고 OAuth 라이브러리

  • django-allauth
  • django-oauth-toolkit
  • python-social-auth

django-allauth

django-allauth 설치 및 설정

  • 라이브러리 설치 : pip3 install "django-allauth==0.31.0"
    • 0.31.0 버전을 기준으로 작성 (2017년 3월 기준, 최신버전)
  • 다양한 로그인 방법 (Provider) 지원 #doc
    • daum, kakao, naver, facebook, google, linkedin 등
  • 적용할 Provider를 settings/INSTALLED_APPS 에 추가하고, admin 페이지를 통해 SocialApplication 등록 (client key/secret)

settings.py

아래 설정을 추가한 후에, migrate 필요

#앱 등록및 사용할 Provider 등록
INSTALLED_APPS = [
 # 중략
 'django.contrib.sites',
 'allauth',
 'allauth.account',
 'allauth.socialaccount',
 'allauth.socialaccount.providers.facebook',
 'allauth.socialaccount.providers.kakao',
 'allauth.socialaccount.providers.naver',
]
AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', # 기본 인증 백엔드
 'allauth.account.auth_backends.AuthenticationBackend', # 추가 
]
# 디폴트 SITE의 id
# 등록하지 않으면,각 요청 시에 host명의 Site 인스턴스를 찾습니다.
SITE_ID =1
# 이메일 확인을 하지 않음.
SOCIALACCOUNT_EMAIL_VERIFICATION = 'none' # 아니면  smtp 로 설정

프로젝트/urls.py

urlpatterns = [
 url(r'^accounts/', include('allauth.urls')),
]
  • 주의 : include 시에는 url pattern 끝에 $를 붙이면 안됨

accounts/views.py

세팅된 Provider별 설정현황을 social_app 속성으로 지정

from django.contrib.auth.views import login as auth_login
from allauth.socialaccount.models import SocialApp
from allauth.socialaccount.templatetags.socialaccount import get_providers
from .forms import LoginForm
def login(request):
 providers = []
 for provider in get_providers():
 # social_app속성은 provider에는 없는 속성입니다.
 try:
 provider.social_app = SocialApp.objects.get(provider=provider.id, sites=settings.SITE_ID)
 except SocialApp.DoesNotExist:
 provider.social_app = None
 providers.append(provider)
 return auth_login(request,
 authentication_form=LoginForm,
 template_name='accounts/login_form.html',
 extra_context={'providers': providers})

accounts/templates/accounts/login_form.html

{% extends "accounts/layout.html" %}
{% load socialaccount %}
{% block content %}
 <form action="" method="post">
 {% csrf_token %}
 <table>
 {{ form.as_table }}
 </table>
 <input type="submit" />
 </form>
 <h3>Social Login</h3>
 <ul>
 {% for provider in providers %}
 <li>
 {% if provider.social_app %}
 <a href="{% provider_login_url provider.id %}">
 {{ provider.name }}
 </a>
 {% else %}
 <a>
 Provider {{ provider.name }} 설정이 필요합니다.
 </a>
 {% endif %}
 </li>
 {% endfor %}
 </ul>
{% endblock %}

프로필 이미지 노출

accounts/templates/accounts/profile.html

<img src="{{ user.socialaccount_set.all.first.get_avatar_url }}" />

페이스북 로그인, 적용순서

https://developers.facebook.com/

  • facebook for developers 에서 "새 앱" 등록
  • 새로이 생성된 앱의 app_id, app_secret 키를 복사
  • "Facebook 로그인" 설정에서 "유효한 OAuth 리다이렉션 URI" 세팅
  • 장고 admin 페이지에서 Facebook Provider에 대해, 새로운SocialApp 으로서 등록

네이버 로그인, 적용순서

https://developers.naver.com
NAVER Developers :: 내 애플리케이션 내, 지정 애플리케이션 -> 설정

  • "로그인 오픈 API" 활성화
  • 이용목적 : "로그인 오픈 API (네이버 아이디로 로그인)" 체크
  • 로그인 오픈 API 서비스 환경 : "웹" 체크
  • 애플리케이션 개발 상태 : 릴리즈 시에 "서비스 적용" 체크
    • "개발 중" 상태일 경우, 로그인 가능한 아이디 제한 (최대 20개)

카카오 로그인, 적용순서

https://developers.kakao.com
Kakao Developers / 내 애플리케이션에서 앱 등록

  • 특이사항 : 카카오 oauth 설정에서는 시크릿키는 없습니다.
  • 사이트 도메인에 다음 추가