使用 Djoser 和 Django Rest Framework 激活帐户

Posted

技术标签:

【中文标题】使用 Djoser 和 Django Rest Framework 激活帐户【英文标题】:Accounts activation with Djoser and Django Rest Framework 【发布时间】:2020-04-07 15:34:43 【问题描述】:

我在我的项目中使用 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."

我真的请求你们帮助我。

【问题讨论】:

你的 DRF 设置是什么? 你得到它的工作,我也得到“没有提供身份验证凭据。”目前,不知道为什么。但我会调查一下,可能很快就会分享一个解决方案。 【参考方案1】:

要回答您的原始问题(如何为激活 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

【讨论】:

【参考方案2】:

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

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

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

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

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

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

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

基本流程是这样的:

1 个用户注册

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

电子邮件中这个 URL 的形成方式可以通过 ACTIVATION_URL 设置进行更改:在我的例子中是 "ACTIVATION_URL": "auth/request_activate/uid/token",

/uid/token表示我们可以在链接指向的视图中使用uidtoken

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 作为参数,然后使用 requests 库在 POST 请求中将其发送到实际 (Djoser) 视图。

post_url 在此处创建是 Djoser 文档中提到的用于电子邮件激活的 Default URL/users/activation/(您可能会找到较旧的网址 /users/activate/,不要使用它,不会工作;) )。

请注意,我的网址中有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 复选框。

【讨论】:

以上是关于使用 Djoser 和 Django Rest Framework 激活帐户的主要内容,如果未能解决你的问题,请参考以下文章

DRF:如何将 django-rest-framework-jwt 集成到 Djoser

Django Rest Framework djoser 激活问题

在 Djoser 和 Rest Framework 中使用自定义字段注册用户

带有 Knox 代币的 DRF 的 Djoser

如何使用 Django Djoser 处理激活 url?

Django,Djoser 社交身份验证:在服务器端会话数据中找不到状态。状态码 400