Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 놀이동산의슈퍼컴퓨터를작동시켜라
- 노트북덮개
- 결과를얻는법
- texttospeech
- 나는리뷰어다
- 심플소프트웨어
- 신영준
- 로그남기기
- 2019회고
- graphicdriver
- 인하대학교
- Xangle
- tacotron
- CrossAngle
- 서버로그
- jaypark.dating
- 프로그라피
- 프로그래머스
- machinelearning
- 서구동구예비군훈련장
- 타코트론
- 개발자를위한파이썬
- 인천남중
- 쇠막대기
- 개발자회고
- 한빛미디어
- 인하멘토링
- 봉사활동
- intell
- 우분투비트확인
Archives
- Today
- Total
jc.jang
11강 이메일을 통한 URL 로그인 만들기 본문
주제
- 비밀번호를 기억하지 않고 이메일만으로 로그인을 구현할 수 있다.
- 로그인하기 위해서는 아이디와 비밀번호를 기억해야한다. 하지만 자주 방문하는 서비스가 아니라면, 사용자의 이메일에 로그인 가능한 URL을 제공하면 더이상 비밀번호를 기억할 필요가 없다.
노트
- askdjango-s2-auth를 보고 작성함
- accounts/urls.py
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
urlpatterns = [
# ...
path('login/url/', views.RequestLoginViaUrlView.as_view(), name='request_login_via_url'),
path('login/<uidb64>/<token>/', views.login_via_url, name='login_via_url'),
# ...
]
- 사용자가 URL 로그인을 요청하기 위해 'login/url/'을 방문함
- 이 곳에서 사용자의 이메일을 입력하면 'URL 로그인'용 URL을 메일로 전송함
- 'URL 로그인'용 URL은 'login/<uidb64>/<token>/' 형식으로 구성되어 있고 방문 시 views.py에서 실제 사용자인지 확인함
- accounts/views.py
from django.core.exceptions import ValidationError
from django.contrib import messages
from django.contrib.auth.views import PasswordResetView
from django.contrib.auth.tokens import default_token_generator
from django.utils.http import urlsafe_base64_decode
from django.http import Http404
class RequestLoginViaUrlView(PasswordResetView):
template_name = 'accounts/request_login_via_url_form.html'
title = '이메일을 통한 로그인'
email_template_name = 'accounts/login_via_url.html'
success_url = settings.LOGIN_URL
def login_via_url(request, uidb64, token):
User = get_user_model()
try:
uid = urlsafe_base64_decode(uidb64).decode()
current_user = User.objects.get(pk=uid)
except (TypeError, ValueError, OverflowError, User.DoesNotExist, ValidationError):
raise Http404
if default_token_generator.check_token(current_user, token):
auth_login(request, current_user)
messages.info(request, '로그인이 승인되었습니다.')
return redirect('root')
messages.error(request, '로그인이 거부되었습니다.')
return redirect('root')
- 사용자가 'login/url/' 방문 시 이메일을 입력하면 입력받은 이메일로 'accounts/login_via_url.html' 템플릿에 맞춰 이메일을 전송함. 이 이메일에는 로그인용 URL이 담겨있음
- 사용자가 이메일을 확인하여 '{{ protocol }}://{{ domain }}{% url "login_via_url" uidb64=uid token=token %}' 형식의 URL을 클릭하면 'login_via_url' 함수에서 존재하는 User인지, token 값이 유효한지 확인하고 로그인 혹은 로그인 거부를 함
- accounts/templates/accounts/request_login_via_url_form.html
{% extends "accounts/layout.html" %}
{% block content %}
<h2>이메일로 로그인</h2>
<form action="" method="POST">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<input type="submit"/>
</form>
{% endblock %}
- 이메일을 입력 받음
- accounts/templates/accounts/login_via_url.html
아래 주소를 통해 {{ site_name }}에 로그인하실 수 있습니다.
링크: {{ protocol }}://{{ domain }}{% url "login_via_url" uidb64=uid token=token %}
- 'URL 로그인'용 링크를 전송함
질문
- 강의에서 사용한 방식은 이미 회원가입한 사용자에 대해서만 조회를 한다.
- 아예 회원가입을 이메일만 받고 로그인할 때 마다 이메일을 확인하도록 하는 것도 가능할 것 같다(pycon에서 사용하는 방식)
- pycon2018 views.py
@never_cache
def login_req(request, token):
time_threshold = datetime.now() - timedelta(hours=1)
try:
token = EmailToken.objects.get(token=token,
created__gte=time_threshold)
except ObjectDoesNotExist:
return render(request, 'login_notvalidtoken.html',
{'title': _('Not valid token')})
email = token.email
# Create user automatically by email as id, token as password
try:
user = User.objects.get(email=email)
except ObjectDoesNotExist:
user = User.objects.create_user(email, email, token)
if is_pycon_user(email):
user.is_staff = True
user.is_superuser = True
user.save()
# Set backend manually
user.backend = 'django.contrib.auth.backends.ModelBackend'
user_login(request, user)
return redirect(reverse('index'))
- 토큰을 비밀번호로하여 User를 생성함
요약
- PasswordResetView를 응용하여 URL 로그인을 구현할 수 있다.
날짜
- 오후 12시, 20190903
'Django > Django - 인증편' 카테고리의 다른 글
13강 암호 재설정 구현하기 (0) | 2019.09.03 |
---|---|
12강 암호 변경 구현하기 (0) | 2019.09.03 |
10강 가입환영 이메일 보내기 (0) | 2019.09.03 |
9강 로그인 아이디로 이메일 사용하기 (1) | 2019.09.02 |
8강 회원가입 시 next 인자 처리하기 (0) | 2019.09.02 |
Comments