2017-02-06 4 views
2

Я использую DRF с аутентификацией JWT (JSON Web Token). Я хочу использовать встроенную функцию восстановления пароля django. Таким образом, я включил в URLs:Как подключить Django Rest Framework с вкладками contrib.auth

url('^', include('django.contrib.auth.urls')), 

Но, конечно же, под API, вызывая https://.../password_reset/ результаты на ошибки csrf token missing. Мне интересно, какой aproach я должен принять, чтобы решить эту проблему. Должен ли я изменить встроенный вид reset_password и удалить защиту csrf? Лучше ли вы создать конечную точку DRF, которая принимает параметр представления email (reset_password), а затем каким-то образом генерирует токен csrf и отправляет его в представление с помощью redirect(reverse("reset_password"), email=email) ... но тогда redirect не отправит запрос postreset_password вид. Возможно, сохраните сообщение по электронной почте до session? Любые советы помогут.

+0

Проверьте это: https://github.com/sunscrapers/djoser может быть проще для вас сделать. –

+0

Вы можете попробовать django-rest-auth для аутентификации/сброса пароля и т. Д .: http://django-rest-auth.readthedocs.io/en/latest/api_endpoints.html – sarc360

ответ

3

Я думаю, что в случае конечной точки сброса пароля можно безопасно удалить защиту CSRF. Защита CSRF предназначена для аутентифицированных конечных точек, чтобы другие веб-сайты не использовали учетные данные пользователя для получения несанкционированного доступа. Поскольку PasswordResetForm, используемый Django, не делает ничего, кроме отправки сообщения электронной почты, злоумышленник не может действительно сделать что-то другое, кроме раздражающего пользователя, путем рассылки спама с помощью электронных писем с паролем.

Вы, можете использовать для этого, но если все, что вы делаете, это добавление конечной точки для сброса пароля, вам просто нужно несколько строк кода.

views.py

import json 

from django.contrib.auth.forms import PasswordResetForm 
from django.http.response import HttpResponse 
from django.views.decorators.csrf import csrf_exempt 
from django.views.decorators.http import require_http_methods 


@csrf_exempt 
@require_http_methods(['POST']) 
def email_password_reset(request): 
    # the POST body should be in the format {'email': '[email protected]'} 
    try: 
     # you could also uncomment the following line if you wanted this view to be anonymous only 
     # assert not request.user.is_authenticated() 
     assert request.META.get('CONTENT_TYPE', '') == 'application/json' 
     body = json.loads(request.body) 
    except (AssertionError, TypeError): 
     pass 
    else: 
     form = PasswordResetForm(body) 

     if form.is_valid(): 
      form.save() 
    finally: 
     return HttpResponse(status=200) 

urls.py

urlpatterns = patterns(... 
    url(r'^/api/password_reset/$', 'email_password_reset', name='email-password-reset') 
...)