Активация учетных записей с помощью Djoser и Django Rest Framework

Я использую Djoser для аутентификации в своем проекте. Я изо всех сил пытаюсь добавить активацию электронной почты уже более 4 дней, но, похоже, не смог ее правильно понять, так как документация мне немного сложна для понимания.

Это мой код settings.py

#change auth model to custom model
AUTH_USER_MODEL = 'userauth.User'

#setting up email server
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'codemanuzmaster'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = '[email protected]'

#djoser login settings
DJOSER = {
    'DOMAIN': 'localhost:8000',
    'SITE_NAME': 'net',
    'LOGIN_FIELD':'email',
    'USER_CREATE_PASSWORD_RETYPE':True,
    'ACTIVATION_URL': '#/users/activate/{uid}/{token}',
    'SEND_ACTIVATION_EMAIL': True,
    'SERIALIZERS':{
        'user_create':'userauth.serializers.UserCreateSerializer',
        'user':'userauth.serializers.UserCreateSerializer',
        'activation': 'djoser.email.ActivationEmail',
    }
}

вот письмо, которое я получаю после создания пользователя

http://example.com/auth/users/activate/MQ/5c9-26bcab9e85e8a967731d

Он показывает example.com, но я хочу, чтобы вместо этого он изменил веб-URL на localhost: 8000

Вы получили это письмо, потому что вам нужно завершить процесс активации на сайте example.com.

Пожалуйста, перейдите на следующую страницу, чтобы активировать учетную запись:

http://example.com/auth/users/activate/MQ/5c9-26bcab9e85e8a967731d

И если я вручную изменю веб-адрес на

http://127.0.0.1:8000/users/activate/MQ/5c9-26bcab9e85e8a967731d

он продолжает возвращаться

{
    "detail": "Authentication credentials were not provided."
}

Я действительно прошу вас помочь мне.


person okumu justine    schedule 14.12.2019    source источник
comment
Какие у вас настройки DRF?   -  person JPG    schedule 14.12.2019
comment
У вас получилось, я также получаю, что учетные данные для аутентификации не были предоставлены. в настоящее время, не зная почему. Но я изучу это и, вероятно, скоро смогу поделиться решением.   -  person Rik Schoonbeek    schedule 13.03.2020


Ответы (2)


Чтобы ответить на ваш исходный вопрос (как использовать другой домен для URL-адреса активации), вам необходимо удалить DOMAIN и SITE_NAME из настроек Djoser. Пример:

DOMAIN = config('DOMAIN') #localhost:8000
SITE_NAME = config('SITE_NAME') #net

DJOSER = {
    'LOGIN_FIELD':'email',
    'USER_CREATE_PASSWORD_RETYPE':True,
    'ACTIVATION_URL': '#/users/activate/{uid}/{token}',
    'SEND_ACTIVATION_EMAIL': True,
    'SERIALIZERS':{
        'user_create':'userauth.serializers.UserCreateSerializer',
        'user':'userauth.serializers.UserCreateSerializer',
        'activation': 'djoser.email.ActivationEmail',
}

Тогда вы должны получить следующую ссылку в своем электронном письме:

http://localhost:8000/auth/users/activate/MQ/5c9-26bcab9e85e8a967731d
person Adrian Gonzalez    schedule 26.06.2020

У меня он работает, используя этот SO-ответ: https://stackoverflow.com/a/47159919/8110396

Я могу объяснять то, что вы уже понимаете, но это может помочь другим увидеть, как это происходит.

Глядя на документы Djoser по User Activation, говорится, что "эта конечная точка не является URL-адресом, который будет напрямую открыт для ваших пользователей",

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

Я предполагаю, что вы можете сделать это как из Frontend, где некоторый JavaScript, используя fetch / axios, вызовет представление активации электронной почты. Но это также можно сделать, если представление Django содержит код, который будет вызывать представление активации электронной почты.

По сути, ссылка на электронную почту запускает код (JS / Python), который отправляет HTTP-запрос на отправку в представление Django.

Я не знаю, что лучше всего, но все это решение пройдет через Django.

Основной поток таков:

Зарегистрирован 1 пользователь

2 Пользователь отправляет электронное письмо с URL-адресом, в котором есть два важных элемента информации, которые нам нужны: uid и token.

Формирование этого URL-адреса в электронном письме можно изменить с помощью параметра ACTIVATION_URL: "ACTIVATION_URL": "auth/request_activate/{uid}/{token}", в моем случае.

/{uid}/{token} означает, что мы можем использовать uid и token в представлении, на которое ведет ссылка.

3 Эта ссылка ведет к представлению Django, которое выполняет активацию пользователя

views.py:

from rest_framework import permissions
from rest_framework.decorators import (
    api_view,
    permission_classes,
)
from rest_framework.response import Response
from rest_framework.views import APIView

import requests


@api_view(["GET"])
@permission_classes([permissions.AllowAny])
def request_user_activation(request, uid, token):
    """ 
    Intermediate view to activate a user's email. 
    """
    post_url = "http://127.0.0.1:8000/djoser_auth/users/activation/"
    post_data = {"uid": uid, "token": token}
    result = requests.post(post_url, data=post_data)
    content = result.text
    return Response(content)

Как вы можете видеть, функция представления получает uid и token в качестве аргументов, которые затем отправляются в запросе POST в фактическое (Djoser) представление с использованием библиотеки requests.

Созданный здесь post_url - это тот, который упоминается в документации Djoser как Default URL для активации по электронной почте: /users/activation/ (вы можете найти более старые URL-адреса /users/activate/, не используйте их, не сработает;)).

Имейте в виду, что в моем URL-адресе djoser_auth, где по умолчанию просто auth, не буду углубляться в то, почему это так, но вот мои основные urls.py:

from django.urls import include, path


urlpatterns = [
    ...
    path("auth/", include("authentication.urls")),
    ...
    path("djoser_auth/", include("djoser.urls")),
    path("djoser_auth/", include("djoser.urls.jwt")),
]

И мой settings.py:

DJOSER = {
    "ACTIVATION_URL": "auth/request_activate/{uid}/{token}",
    "SEND_ACTIVATION_EMAIL": True,
    "SERIALIZERS": {},
    "USER_CREATE_PASSWORD_RETYPE": True,
}

Таким образом, используя это, вы должны иметь возможность щелкнуть ссылку в электронном письме, и у вашего пользователя установлен флажок is activated в админке.

введите описание изображения здесь

person Rik Schoonbeek    schedule 13.03.2020