3

我在我的项目中使用 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 = 'okumujustine01@gmail.com'
EMAIL_HOST_PASSWORD = 'codemanuzmaster'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'okumujustine01@gmail.com'

#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 ,但我希望它将 web 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."
}

我真的请求你们帮助我。

4

2 回答 2

3

要回答您的原始问题(如何为激活 url 使用不同的域),您需要从 Djoser 设置中删除 DOMAIN 和 SITE_NAME。例子:

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
于 2020-06-26T01:43:18.757 回答
0

我已经使用这个 SO 答案让它工作了:https ://stackoverflow.com/a/47159919/8110396

我可能会解释你已经理解的事情,但它可能会帮助其他人了解它是如何进行的。

查看有关User Activation的 Djoser 文档,它说“此端点不是将直接暴露给您的用户的 URL”,

这意味着使用的链接不会提供给注册的人,您在电子邮件中获得的链接需要激活一些代码,这些代码将执行对 Django 视图的调用,该视图将激活用户的电子邮件。

我想你可以从前端执行此操作,其中一些 JavaScript 使用 fetch/axios 将调用电子邮件激活视图。但也可以通过让 Django 视图包含调用电子邮件激活视图的代码来完成。

所以基本上,电子邮件链接将触发代码(JS/Python),将 http post 请求发送到 Django 视图。

我不知道最好的选择是什么,但这个解决方案都会通过 Django。

基本流程是这样的:

1 用户注册

2 用户正在发送一封带有 URL 的电子邮件,其中包含我们需要的两个重要信息,即uidtoken

电子邮件中此 URL 的形成方式可以通过ACTIVATION_URL设置进行更改:"ACTIVATION_URL": "auth/request_activate/{uid}/{token}",在我的情况下。

/{uid}/{token}意味着我们可以在链接指向的视图中使用uidand 。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)

如您所见,视图函数接收uidtoken作为参数,然后Djoser使用库在 POST 请求中将其发送到实际 ( ) 视图requests

post_url这里创建的是 Djoser 文档中提到的Default URL用于电子邮件激活的那个:(/users/activation/您可能会发现较旧的 url /users/activate/,不要使用它,不会工作;))。

请注意,我djoser_auth在我的 url 中,默认值为 just 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在管理员中选中该复选框。

在此处输入图像描述

于 2020-03-13T21:46:29.683 回答